c#单元测试 – 重载方法测试的命名约定

我有一些简单的扩展方法在c#我正在编写单元测试.其中一种扩展方法是超载的,所以我无法为单元测试提供合理的命名约定.

示例重载方法

public static class StringExtensions
{
    public static List<string> ToList(this string value,char delimiter)
    {
        return ToList(value,new[] { delimiter });
    }

    public static List<string> ToList(this string value,char[] delimiterSet) { .. }
}

如果我想写两个单元测试,每个方法一个,你如何命名测试?通常我会使用:

[TestMethod,TestCategory("Single Method Tests")]
public void ToListTest

但是用两个同名的方法,我正在努力找到一个很好的约定

[TestMethod,TestCategory("Single Method Tests")]
public void ToListTest

[TestMethod,TestCategory("Single Method Tests")]
public void ToListTestOverload

是可怕的

[TestMethod,TestCategory("Single Method Tests")]
public void ToListTestWithChar

[TestMethod,TestCategory("Single Method Tests")]
public void ToListTestWithChararray

基于参数类型更好,但仍然相当可怕.

有些可能会建议编写一个既可以针对两个重载的测试方法,但是我希望与单元测试和方法具有1:1的关系,即使当前链接过载.我不想在测试中做出任何假设,即重载被链接和传递.

你会如何处理?

解决方法

Roy Osherove在他的书“单元测试的艺术”中基于您尝试测试的行为推荐命名约定,并不一定在生产方法和测试方法之间进行一对一的映射.所以,作为一个简单的例子,假设我有一个Stack类,像这样:
public class Stack
{
    public void Push(int value);
    public int Pop();
    public bool IsEmpty();
}

编写测试的一种方法是具有三种测试方法

[TestMethod]
public void PushTest

[TestMethod]
public void PopTest

[TestMethod]
public void IsEmptyTest

但是,有一个更好的测试方法指定了Stack类的行为.那么想法就是你在类行为和测试方法之间有一对一的映射.所以,一个行为是空堆栈上的IsEmpty返回true.另一个是推一个元素使堆栈不空.然后,我将根据这些简单的英文句子以Arrange/Act/Assert格式编写测试,指定这些行为的格式如下:

MethodName_StateOfTheObject_ExpectedResult

所以对于上面提到的行为:

[TestMethod]
IsEmpty_OnEmptyStack_ReturnsTrue

[TestMethod]
Push_OnEmptyStack_MakesstackNotEmpty

我会鼓励您考虑上述方法试图测试的行为,然后将这些行为映射到测试.例如:

[TestMethod]
ToList_OnEmptyString_ReturnsEmptyList

[TestMethod]
ToList_OnStringWithDelimiters_ReturnsListWithTokensSeparatedByDelemiter

[TestMethod]
ToList_OnStringWithoutDelimiters_ReturnsListWithOnestring

更多信息here

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...