Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Nunit(C#)是否有测试局部变量?_C#_Nunit - Fatal编程技术网

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问题。给我们一个更完整的问题,这样我们可以给你一个更完整的答案。”