Nunit(C#)是否有测试局部变量?
我有两个测试:Nunit(C#)是否有测试局部变量?,c#,nunit,C#,Nunit,我有两个测试: [TestFixture(Category = "MyCategory")] public class MyTestFixture { private int count = 0; [SetUp] public void BeforeEachTest() { this.count++; } [Test] public void AssertCountIs1_A() { Assert
[TestFixture(Category = "MyCategory")]
public class MyTestFixture
{
private int count = 0;
[SetUp]
public void BeforeEachTest()
{
this.count++;
}
[Test]
public void AssertCountIs1_A()
{
Assert.AreEqual(1, this.count);
}
[Test]
public void AssertCountIs1_B()
{
Assert.AreEqual(1, this.count);
}
}
两个测试中的一个总是会失败,因为其中一个测试的计数为1,而另一个测试的计数为2。我知道这是因为count
成员在MyTestFixture
实例的生命周期内存在
我是否可以声明我希望count
仅在给定测试的生命周期内存在?例如,是否有一些属性可以预先添加到count
,以便这两个测试都成功
如果没有,我可以制定一个解决方案,保留一个字典,将测试名称映射到计数。如果可以的话,我宁愿避免这种情况。是的,NUnit有这样的变量,或者至少C#有这样的变量。它们称为局部变量,并在测试主体中声明。因此,它们仅在测试运行期间存在,并且每次都会重新初始化 你能否将它们用于你的目的取决于你的目的是什么。你的问题没有提供太多关于这方面的信息。我想这是因为你们试图把问题“归结”为一些简单的东西,我们都能理解。不幸的是,如果你过于简化,就很难帮助你
根据注释中的扩展讨论,您可能不需要局部变量,因为您希望它们在测试的多个执行过程中存在。对吗?更完整的问题可能会得到更完整的答案。在示例代码中,如果将NUnit配置为在每个测试中创建类的新实例,则断言将成功。(MSTest和XUnit已经完成了这项工作)。这在NUnit中不可用,因此需要更新示例代码以使断言成功。以下是讨论内容不清楚您为什么想要这个?为什么您的测试试图在不同的运行时间之间保持状态,并通过使用另一个测试也在使用的变量来实现这一点?当然,显而易见的答案是“在测试方法中只使用局部变量”和“测试方法之间不共享此字段”@canton7我想为集成测试设置TransactionScope。另外,我不是问这是不是一个好主意,我是问如何使用带有
TearDown
属性的方法重新初始化为默认值public void TearDown(){this.count=0;}
@chadnt,这将与我设计的count
示例一起使用。如果我可以标记每个测试都应该重新初始化count
,那也可以。我在问努尼特有没有that@user2023861我这样问是因为这几乎肯定是一个XY问题。当然,不同的单元测试之间没有相同的TransactionScope
,在一个测试和下一个测试之间以某种方式对其进行变异,而是每个测试都有一个TransactionScope
?也就是说,每个SetUp
方法都会有效地执行this.count=0
,而不是this.count++
如何从SetUp和TearDown方法访问这些“局部变量”?您不能。这就是为什么他们是本地人。C#中的局部变量存在于堆栈上,当包含块(在本例中是一个方法)退出时就会消失。另一个用户已经回答了我的问题(以尽可能全面的方式)。我想要的东西在NUnit没有。如果在每次测试运行时重新初始化我的count
变量,我的测试就会通过。显然没有办法做到这一点。是的,我可以在所有的测试中创建局部变量,但是我会有太多的代码重复。我问题中的代码只是一个人为的例子。我有两个以上的测试。@user2023861正如您所说,您实际提出的问题(关于C#局部变量)得到了回答。考虑再问一个更高层次的问题,那就是,你想要完成什么。我相信你认为我们都可以从你的问题中看到这一点,但我当然不能。我真的不理解你对我的问题的困惑。我问,Nunit能做X吗?答案是否定的,Nunit不能做X。这就像我问了这个问题,回答是:“为什么要退出Vim?不清楚为什么要退出Vim。这几乎肯定是一个XY问题。给我们一个更完整的问题,这样我们可以给你一个更完整的答案。”