NUnit使用备用构造函数执行

时间:2009-09-18 00:00:34

标签: c# .net unit-testing nunit

我有一个类有一些单元测试,但是当我运行测试时,我希望用不同的构造函数创建类。像这样:

[TestFixture]
public class MyClass
{
    public MyClass() { /* set up for production */ }

    [TestFixtureConstructor]
    public MyClass() { /* set up for testing */ }

    [Test]
    public void FirstTest()
    {
        // assert some values
    }
}

这甚至可能吗?

我考虑过使用静态工厂方法在生产中创建类(使用私有构造函数),以及测试框架的公共构造函数。

有没有人有其他解决方案?

3 个答案:

答案 0 :(得分:9)

你不这样做。

你没有在里面写你在真实代码中使用的类;你在类外部编写测试。我相信大多数测试套件都有'拆解'的概念,而相反;为给定的执行设置测试环境。

答案 1 :(得分:3)

快速举例说明丝滑的正确方法:

public class MyClass
{
    // ...
}

// In a different assembly:

[TestFixture]
public class TestMyClass
{
    [SetUp]
    public void SetUp()
    {
        _myClass = new MyClass();
    }

    [Test]
    public void FooReturnsTrue()
    {
        Assert.That(_myClass.Foo(), Is.True);
    }

    // more tests

    private MyClass _myClass;
}

答案 2 :(得分:2)

如果你真的真的想要这个,你可以看一下TestFixtureSetUp

以下是介绍:

此属性在TestFixture内部使用,以提供在执行夹具中的任何测试之前执行一次的单个函数集。 TestFixture只能有一个TestFixtureSetUp方法。如果定义了多个,则TestFixture将成功编译,但其测试将不会运行。

示例:

namespace NUnit.Tests
{
  using System;
  using NUnit.Framework;

  [TestFixture]
  public class SuccessTests
  {
    [TestFixtureSetUp] public void Init()
    { /* ... */ }

    [TestFixtureTearDown] public void Dispose()
    { /* ... */ }

    [Test] public void Add()
    { /* ... */ }
  }
}

但是你应该谨慎使用它,否则就会失败the purpose of unit test