我有一个类有一些单元测试,但是当我运行测试时,我希望用不同的构造函数创建类。像这样:
[TestFixture]
public class MyClass
{
public MyClass() { /* set up for production */ }
[TestFixtureConstructor]
public MyClass() { /* set up for testing */ }
[Test]
public void FirstTest()
{
// assert some values
}
}
这甚至可能吗?
我考虑过使用静态工厂方法在生产中创建类(使用私有构造函数),以及测试框架的公共构造函数。
有没有人有其他解决方案?
答案 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。