[英]Why would an assert on a unit test with HostType(“Moles”) pass when run individually, but fail when run with a group of tests?
我最近上了Pex&Moles潮流,用一些静态,非虚拟,密封等元素来测试某些逻辑。最近,我开始看到一些测试无法解释的行为。
我断的接口的几种方法都返回void,因此我将存根设置为委托,这些委托会更新布尔变量以指示已被调用。 这是我在做什么:
[TestMethod]
[HostType("Moles")]
public void UnitTestX()
{
bool disposeCalled = false;
bool getCalled = false;
ClassX classX = new ClassX();
var data = new SIClassXData
{
Dispose = () => disposeCalled = true,
Get = () => getCalled = true,
ClassXGet = () => classX
};
MDataLayerFactory.CreateDataLayerObject(() => (IClassXData)data);
Assert.IsTrue(disposeCalled);
Assert.IsTrue(getCalled);
}
无论出于何种原因,如果我单独运行此测试,上述断言都会成功。 但是,如果我将测试与程序集中的其他所有测试一起运行(使用Visual Studio的“在解决方案中运行所有测试”功能),则第一个断言将失败。
我想知道为什么会发生这种情况,以及我需要更改以解决此问题的原因。
难道这只是使用多个线程执行测试的“运行所有测试”的副作用? 那么,在Assert触发时Dispose()尚未运行?
尝试使用ManualResetEvent阻止测试方法,直到Dispose()运行为止? 就像是;
public void UnitTestX()
{
// use this to block the test thread until Dispose() is run
ManualResetEvent mre = new ManualResetEvent(false);
bool disposeCalled = false;
bool getCalled = false;
ClassX classX = new ClassX();
var data = new SIClassXData
{
Dispose = () => {
disposeCalled = true;
mre.Set(); // release the test thread now
},
Get = () => getCalled = true,
ClassXGet = () => classX
};
MDataLayerFactory.CreateDataLayerObject(() => (IClassXData)data);
Assert.IsTrue(mre.WaitOne(1000)); // give it a second to fire
Assert.IsTrue(disposeCalled);
Assert.IsTrue(getCalled);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.