C# 如何使用OneTimeSetup?

C# 如何使用OneTimeSetup?,c#,unit-testing,nunit,C#,Unit Testing,Nunit,NUnit具有OneTimeSetup属性:。当我可以使用它的时候,我试着去想一些场景。但是,我在网上找不到任何GitHub示例(即使我的链接也没有示例) 假设我有这样的代码: [TestFixture] public class MyFixture { IProduct Product; [OneTimeSetUp] public void OneTimeSetUp() { IFixture fixture = new Fixture().Cu

NUnit具有OneTimeSetup属性:。当我可以使用它的时候,我试着去想一些场景。但是,我在网上找不到任何GitHub示例(即使我的链接也没有示例)

假设我有这样的代码:

[TestFixture]
public class MyFixture
{
    IProduct Product;

    [OneTimeSetUp]
    public void OneTimeSetUp()
    {
        IFixture fixture = new Fixture().Customize(new AutoMoqCustomization());
        Product = fixture.Create<Product>();
    }

    [Test]
    public void Test1()
    {
      //Use Product here
    }

    [Test]
    public void Test2()
    {
      //Use Product here
    }

    [Test]
    public void Test3()
    {
      //Use Product here
    }
}
[TestFixture]
公共类MyFixture
{
i产品;
[一次性设置]
public void OneTimeSetUp()
{
IFixture fixture=new fixture().Customize(new AutoMoqCustomization());
Product=fixture.Create();
}
[测试]
公共void Test1()
{
//在这里使用产品
}
[测试]
公共无效测试2()
{
//在这里使用产品
}
[测试]
公共无效测试3()
{
//在这里使用产品
}
}

这是否是在OneTimeSetup内初始化变量的有效方案,即,因为在这种情况下,所有测试方法都使用产品?

对于我来说,Moq的夹具设置似乎是合理的


但是,重复使用相同的
产品是可疑的,因为它可能会被修改和意外重复使用,从而导致测试不稳定。每次测试运行时,我都会得到一个新的
产品
,如果它是被测试的系统。

是的,您可以使用
OneTimeSetUp
(和
onetimeeardown
)来完成该夹具中测试之间共享的所有设置。它在每次测试运行中运行一次,因此不管fixture中有多少测试,代码都将执行一次。通常,您将初始化私有字段等中保存的实例以供其他测试使用,这样您就不会得到大量重复的设置代码。

是。编号:-)

是的<代码>[OneTimeSetUp]
按您的预期工作。它执行一次,然后所有测试和所有测试都将使用相同的产品

不。。。您可能不应该以这种方式使用它,假设产品的初始化成本不是很高——很可能不是,因为它是基于模拟的

OneTimeSetUp
最好仅用于成本极高的步骤,如创建数据库。事实上,它在纯粹的单元测试中几乎没有用处


您可能会想,“如果它更高效一点,为什么不一直使用它呢?”答案是您正在编写测试,这意味着您实际上不知道被测代码将做什么。您的某个测试可能会更改通用产品,甚至可能使其处于无效状态。您的其他测试将开始失败,这使得您很难找出问题的根源。您几乎总是希望首先使用
设置
,这将为您的每个测试创建一个单独的产品。

谢谢。Autofixture是否仅用于创建模拟对象(我对此没有任何经验)?目前我正在测试我的应用程序的核心元素,它没有依赖性。因此我想我不应该使用Autofixture?@w0051977我个人不知道。谢谢。Autofixture是否仅用于创建模拟对象(我对此没有任何经验)?目前我正在测试我的应用程序的核心元素,它没有依赖性。因此,我想我不应该使用Autofixture?@w0051977,这最好作为一个单独的问题来问,这很公平。我在这里发布了另一个问题:如果你想回答,假设我想建立一个列表,用于每个方法。我是在每个测试函数中构建列表(在每个测试函数中使用相同的十行代码)还是为其创建一个帮助器类?我试图使用最小惊讶的原则,因为其他人很快就会看到我的代码,也就是说,我不能懒惰。