我正在尝试调试大约30%的时间失败的单元测试。这似乎是某种计时问题,因为不幸的是,当我在代码中有断点时它永远不会失败。
因此,我在有问题的断言处设置了一个条件断点,当断言将为false时触发。正如预期的那样,我在1/3的时间内达到了断点。但是,当我实际检查表达式的值时,一切看起来都没问题。而且,果然,如果我继续,测试成功。
任何人都可以帮助我理解为什么会这样吗?如果另一个线程正在修改该值,那么当我点击断点时线程是否会停止?或者有可能发生这样的事情:
我真的不是在寻找我的问题的具体解决方案(合理发布的代码太多,或者期望任何人跋涉)。我只是在寻找有关条件断点如何工作的一般性输入,以及可能发生这种情况的原因。
注意:我正在使用Visual Studio 2012(如果重要的话,还有.NET 4.0 C#。)
另请注意:
这是失败的断言:
foreach (KeyValuePair<Guid, DateTime> time in state.Times) {
Assert.IsTrue(time.Value > DateTime.Now.AddYears(2) && time.Value <= DateTime.Now.AddYears(3));
}
答案 0 :(得分:2)
您是否碰巧有get {}
个副作用?在观察对象状态时,您可能会更改对象的状态。
例如:
class A {
int one = 0;
int two {
get {
one = 1;
return 2;
}
}
}
现在当你断言A.one == 1
时,它就失败了。如果你看一下,你就会看到two == 2
和one == 1
。当您再次尝试重试时,断言会通过,因为您已更改A.one
。
编辑:
看到您的代码,DateTime.Now
每次调用时都会更改。你不认为那可能吗?
答案 1 :(得分:0)
我也遇到过这个问题。我有以下情况。我向外部设备发送命令,并启动计时器以听取答案。
如果我没有使用断点,它运行正常,没有错误。但是当我使用断点时,大约有70%的时间我遇到了错误。
问题是什么?通过断点,我停止了我的代码监听。但该设备不断发送信息;它确实发送了我正在寻找的答案,而我的代码不再是在听了。
希望这会有所帮助:)