我正在使用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;
}
}
答案 0 :(得分:-1)
单元测试显示给你非常有用的东西:代码中的static
字段是EVIL。 now my production code is not clean
=>由于静力学,它不干净。
如果你想引入单音,请使用您使用的DI框架,或没有DI框架,但使用IoC。
如需了解更多信息,请从这里Dependency Injection & Singleton Design pattern
转到anwser