NUnit. 将参数传递到teardown方法中

10

我正在使用NUnit,我的测试方法定义如下:

[Test]
[TestCase("Fred", "Bloggs")]
[TestCase("Joe", "Smith")]
public void MyUnitTest(string firstName, string lastName)
{
    ...
}

当一个TestCase完成后,它会进入TearDown方法。我想做的是,将那些传递到测试方法中的TestCase参数也传递到TearDown方法中。

像这样:

[TearDown]
public void TearDown(string firstName, string lastName)
{
  ...
}
我希望 NUnit 可以直接支持这个功能。否则,我需要在测试方法中编写专门的代码来将测试数据存储在集合中。然后,在 TearDown 方法中使用该集合。
如果有人有任何想法...那就太好了! 谢谢。 Christian
3个回答

10

可以直接从TestContextTearDown 函数中引用参数。

就像这样。

[Test]
[TestCase("Fred", "Bloggs")]
[TestCase("Joe", "Smith")]
public void MyUnitTest(string firstName, string lastName)
{
}

[TearDown]
public void TearDown()
{
    string firstName = TestContext.CurrentContext.Test.Arguments[0] as string;
    string lastName = TestContext.CurrentContext.Test.Arguments[1] as string;
}
应该注意TestContext.CurrentContext.Test.Arguments只是一个对象数组,并且会在TestFixture中的每个测试中调用,而不管各自的签名如何,因此我们应该小心确保处理Arguments[]中的所有可能值,但确实可以在TearDown函数中引用这些对象。

2
+1. 注意:如果有人要使用答案方法,应检查NUnit的版本 - 自v3.7以来,Arguments数组已经可用。 - Serg

8

TearDown和SetUp会在测试夹具中的每个测试中执行。假设您有以下测试:

[TestCase("Joe", "Smith")]
public void Test1(string firstName, string lastName) { ... }

[Test]
public void Test2() { ... }

[TestCase(10)]
public void Test3(int value) { ... }

什么是 TearDown 方法的预期签名?

因此,答案是否定的。NUnit 不提供将测试参数传递到 TearDown 方法的默认方式。我认为它也不会提供这种功能。您需要手动添加此功能。


我在谷歌上搜索了很久,认为NUnit不支持它。但是感谢你的回答,总是好的去确认一下。 - Christian Clarke

5

实际上,这是可能的。

如果在TearDown中引用TestContext.CurrentContext.Test.Name,您可以获得包含传递给它的参数的完整方法签名。虽然需要解析,但信息已经存在。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接