2009-09-18 89 views
2

我有一个类,它有一些单元测试,但是当我正在运行测试时,我想用不同的构造函数创建类。这样的事情: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 
    } 
} 

这甚至可能吗?

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

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

回答

2

这里的介绍:

这一属性用于一个的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

9

你不这样做。

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

+0

100%正确。对于OP - 你不应该尝试特殊的“只测试”构造函数。如果你需要一个构造函数来获取依赖关系,并且唯一使用它的是测试,那很好,但是不应该让其他人隐藏构造函数。它使您的类更灵活,让消费者传递依赖关系。 – womp 2009-09-18 00:17:35

+0

我同意。这绝对是这样做的错误方式。创建一个单独的类并使用Setup和Teardown属性 – lomaxx 2009-09-18 00:18:03

3

为了让柔滑的正确的做法一个简单的例子:如果你真的真的这个你可以看看TestFixtureSetUp

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; 
}