使用通用方法进行参数测试

Gra*_*ton 11 nunit unit-testing

在NUnit 2.5中,您可以这样做:

[TestCase(1,5,7)]
public void TestRowTest(int i, int j, int k)
{
  Assert.AreEqual(13, i+j+k);
}
Run Code Online (Sandbox Code Playgroud)

你可以做参数测试.

但我想知道你是否可以这样做,参数测试与通用测试方法?即:

[TestCase <int>("Message")]
public void TestRowTestGeneric<T>(string msg)
{
  Assert.AreEqual(5, ConvertStrToGenericParameter<T>(msg));
}
Run Code Online (Sandbox Code Playgroud)

或类似的东西.

Ken*_* Xu 22

以下是NUnit 2.5 链接文本的发行说明中的​​引用

参数化测试方法可以是通用的.NUnit将根据提供的参数类型推断出要使用的正确实现.通用和非泛型条款都支持通用测试方法.

据此,可以在非泛型类中使用通用测试方法.怎么样?

我不太明白杰夫的评论.在.net泛型中是编译时和运行时.我们可以使用反射来找出与方法关联的测试用例属性,找出泛型参数,并再次使用反射来调用泛型方法.它会工作,不是吗?

更新:好的,我现在知道怎么做,希望还为时不晚.您需要将泛型类型放在参数列表中.例如:

[TestCase((int)5, "5")]
[TestCase((double)2.3, "2.3")]
public void TestRowTestGeneric<T>(T value, string msg)
{
  Assert.AreEqual(value, ConvertStrToGenericParameter<T>(msg));
}
Run Code Online (Sandbox Code Playgroud)


R.T*_*tov 5

您可以自定义 GenericTestCaseAttribute

    [Test]
    [GenericTestCase(typeof(MyClass) ,"Some response", TestName = "Test1")]
    [GenericTestCase(typeof(MyClass1) ,"Some response", TestName = "Test2")]
    public void MapWithInitTest<T>(string expectedResponse)
    {
        // Arrange

        // Act
        var response = MyClassUnderTest.MyMethod<T>();

        // Assert
        Assert.AreEqual(expectedResponse, response);
    }
Run Code Online (Sandbox Code Playgroud)

这是 GenericTestCaseAttribute 的实现

[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public class GenericTestCaseAttribute : TestCaseAttribute, ITestBuilder
{
    private readonly Type _type;
    public GenericTestCaseAttribute(Type type, params object[] arguments) : base(arguments)
    {
        _type = type;
    }

    IEnumerable<TestMethod> ITestBuilder.BuildFrom(IMethodInfo method, Test suite)
    {
        if (method.IsGenericMethodDefinition && _type != null)
        {
            var gm = method.MakeGenericMethod(_type);
            return BuildFrom(gm, suite);
        }
        return BuildFrom(method, suite);
    }
}
Run Code Online (Sandbox Code Playgroud)