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

发布于 2024-07-19 08:00:49 字数 408 浏览 4 评论 0原文

在 NUnit 2.5 中你可以这样做:

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

你可以进行参数测试。

但我想知道你是否可以用通用测试方法进行参数测试? 即:

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

或者类似的东西。

In NUnit 2.5 you can do this:

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

You can do parametric test.

But I wonder whether you can do this or not, parametric test with generic test method? I.e.:

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

Or something similar.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

谈情不如逗狗 2024-07-26 08:00:49

以下是 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));
}

Here is the quote from the release note of NUnit 2.5 link text

Parameterized test methods may be
generic. NUnit will deduce the correct
implementation to use based on the
types of the parameters provided.
Generic test methods are supported in
both generic and non-generic clases.

According to this, it is possible to have generic test method in non-generic class. How?

I don't quite understand Jeff's comment. In .net generics is both compile-time and run-time. We can use the reflection to find out the test case attribute associated with a method, find out the generic parameter, and again use reflection to call the generic method. It will work, no?

Update: OK, I now know how and hope it is not too late. You need the generic type to be in the parameter list. For example:

[TestCase((int)5, "5")]
[TestCase((double)2.3, "2.3")]
public void TestRowTestGeneric<T>(T value, string msg)
{
  Assert.AreEqual(value, ConvertStrToGenericParameter<T>(msg));
}
酒几许 2024-07-26 08:00:49

您可以自定义 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);
    }

这是 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);
    }
}

You can make custom 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);
    }

Here is implementation of 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);
    }
}
找个人就嫁了吧 2024-07-26 08:00:49

创建一个私有方法并调用它:

    [Test]
    public void TypeATest()
    {
        MyTest<TypeA>();
    }

    [Test]
    public void TypeBTest()
    {
        MyTest<TypeB>();
    }

    private void MyTest<T>()
    {
        // do test.
    }

Create a private method and call that:

    [Test]
    public void TypeATest()
    {
        MyTest<TypeA>();
    }

    [Test]
    public void TypeBTest()
    {
        MyTest<TypeB>();
    }

    private void MyTest<T>()
    {
        // do test.
    }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文