有没有办法使用TestCase在Nunit中的对象上运行不同的操作方法列表?

时间:2012-06-29 09:19:11

标签: c# nunit

说我有以下内容:

  [Test]
  // would like to parameterize the parameters in call AND the call itself
  public void Test()
  {
      var res1 = _sut.Method1(1);
      var res2 = _sut.Method2("test");
      var res3 = _sit.Method3(3);

      Assert.That(res1, Is.Null);
      Assert.That(res2, Is.Null);
      Assert.That(res3, Is.Null);
  }

我想使用TestCase / TestCaseSource属性(包括调用本身)来参数化测试。由于测试的重复性,每个方法都需要使用稍微不同的参数调用,但我需要能够为每个不同的参数标记不同的调用。这在Nunit甚至可能吗?如果是这样,我该怎么做呢?

2 个答案:

答案 0 :(得分:5)

使用TestCaseSource,你应该能够遍历一个值数组并调用所需的方法,例如:

[TestFixture]
public class TestClass
{
  private Sut _sut;

  public TestClass()
  {
    _sut = new Sut(...);
  }

  private IEnumerable<object> TestCases
  {
    get
    {
      var values = new object[,] { { 1, "test", 3 }, { 2, "hello", 0 }, ... };

      for (var i = 0; i < values.GetLength(0); ++i)
      {
          yield return _sut.Method1((int)values[i,0]);
          yield return _sut.Method2((string)values[i,1]);
          yield return _sut.Method3((int)values[i,2]);
      }
    }
  }

  [TestCaseSource("TestCases")]
  public void Test(object val)
  {
    Assert.That(val, Is.Null);
  }
}

请注意,_sut实例需要在TestClass构造函数中实例化。仅在[SetUp][TestFixtureSetUp]方法中初始化它是不够的。

如果您需要为不同的方法调用使用不同的_sut实例,您可以在构造函数中创建Sut个实例的集合,并访问{{1}中的相关Sutfor getter的循环。或者,您甚至可以遍历getter中的所有TestCases个项目......

答案 1 :(得分:0)

Afaik,NUnit中没有这样的内置机制。但是,如果测试中存在多种方法,我认为将它们分成单独的测试是更好的做法。

话虽如此,只要你总是在同一个对象(_sut)上调用这些方法,你就可以通过反射来做到这一点(如果你决定承担所产生的开销)。

例如,在TestCaseSource中添加一个字符串参数,并在test方法中调用它:

Type type = _sut.GetType();
MethodInfo methodInfo = type.GetMethod(methodName);
object result = methodInfo.Invoke(_sut, null);

当您想要参数化的每个方法将采用不同数量的参数时,事情会很快变得复杂。调试和查看哪个测试失败也将更加困难。你最好分开这些测试。