如何在几次测试执行之间返回系统初始状态

时间:2016-11-29 08:02:48

标签: c# unit-testing singleton nunit teardown

我正在使用Nunit,我想知道是否有办法返回真正的初始化状态,包括已构建的所有单例。

目前我已经通过向单例添加一个重置方法的解决方法来解决它,我不喜欢它,因为现在我的生产代码不干净。

据我所知,单音将被初始化一次,并保存在堆中,这在所有测试执行期间都可用。

有没有办法在Nunit testfixture的拆卸功能中清理堆?

我设法用以下(丑陋的)代码示例重现了这个问题,你可以看到,当两个测试一个接一个地执行时,第二个测试失败了......

[TestFixture]
public class SingletonCleanups
{
    private MySingleTonsHolder _holder;
    [SetUp]
    public void Setup()
    {
        _holder = new MySingleTonsHolder();
    }
    [Test]
    public void DoWork_FirstExecution_SingleCalledOnce()
    {
        _holder.DoWork();
        Assert.AreEqual(1, MySingleTonsHolder.MySingleTon.CalledCount);
    }
    [Test]
    public void DoWork_SecondExecution_SingleCalledOnce()
    {
        _holder.DoWork();
        Assert.AreEqual(1, MySingleTonsHolder.MySingleTon.CalledCount);
    }
}

public class MySingleTonsHolder
{
    public static MySingleTon MySingleTon => MySingleTon.Instance();

    public void DoWork()
    {
        MySingleTon.Instance().CalledCount++;
    }
}

public class MySingleTon
{
    private static MySingleTon _instance;
    public static MySingleTon Instance()
    {
        if (_instance==null)
        {
            _instance = new MySingleTon();
        }
        return _instance;
    }
    public int CalledCount { get; set; }
    private MySingleTon()
    {
        CalledCount = 0;
    }
}

1 个答案:

答案 0 :(得分:-1)

单元测试显示给你非常有用的东西:代码中的static字段是EVIL。 now my production code is not clean =>由于静力学,它不干净。 如果你想引入单音,请使用您使用的DI框架,或没有DI框架,但使用IoC。

如需了解更多信息,请从这里Dependency Injection & Singleton Design pattern

转到anwser