0

我正在尝试调试大约 30% 的时间失败的单元测试。这似乎是某种时间问题,因为不幸的是,当我在代码中有断点时它永远不会失败。

因此,我在有问题的断言处设置了一个条件断点,该断点会在断言为假时触发。正如预期的那样,我大约有 1/3 的时间到达了断点。但是,当我实际检查表达式的值时,一切看起来都还不错。而且,果然,如果我点击继续,测试成功。

谁能帮我理解为什么会这样?如果另一个线程正在修改该值,当我到达断点时,线程不会停止吗?或者是否有可能发生这样的事情:

  1. 检查条件...评估为真
  2. 另一个线程修改变量
  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));
}
4

2 回答 2

2

你碰巧有get {}副作用吗?有可能在观察对象的状态时,您已经更改了对象的状态。

例如 :

class A {
    int one = 0;

    int two { 
        get { 
            one = 1; 
            return 2; 
        } 
    }
}

现在,当您断言时A.one == 1,它会失败。如果你看它,你会看到two == 2one == 1。当您再次点击重试时,断言通过,因为您已经更改A.one

编辑 :

看到你的代码,DateTime.Now每次你调用它都会改变。你不觉得可能是这样吗?

于 2012-10-22T23:21:04.910 回答
0

我也遇到过这个问题。我有以下情况。我向外部设备发送命令,并启动计时器来监听答案。

如果我没有使用断点,它运行正常,没有错误。但是当我使用断点时,大约 70% 的时间我都会遇到错误。

出了什么问题?使用断点,我停止了我的代码监听。但是设备一直在发送信息;它确实发送了我正在寻找的答案,而我的代码不再听了。

希望这可以帮助 :)

于 2012-10-29T18:41:46.740 回答