0

我试图调试大约30%的时间内失败的单元测试。这似乎是某种时机问题,因为不幸的是,当我在代码中有一个断点时,它永远不会失败。为什么在一个断点后变量的值会改变?

所以,我在有问题的断言中设置了一个条件断点,当断言将是错误时触发。如预期的那样,我大约三分之一的时间点击了断点。但是,当我真正检查表达的价值时,一切都看起来不错。而且,果然,如果我继续下去,测试会成功。

任何人都可以帮助我理解为什么这可能是这种情况?如果另一个线程正在修改该值,当我打断点时线程是否会停止?或者是有可能这样的事情正在发生:

  1. 检查条件...评价为真
  2. 另一个线程修改变量

我真的不是在寻找特定的我的问题的解决方案(有太多的代码合理发布,或期望任何人跋涉)。我只是在寻找关于条件断点如何工作的一般性输入以及这种事情可能发生的原因。

注意:我使用的是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

代码是什么样的? – ChrisBint

+0

我真的不认为它与断点有什么关系。当你点击一个断点时,所有的执行都会停止。 – climbage

+0

你有任何其他线程改变这个值吗? – MattW

回答

2

你碰巧有任何get {} s的侧面影响?当观察对象的状态时,可能会改变对象的状态。

例如:

class A { 
    int one = 0; 

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

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

编辑:

看到你的代码,DateTime.Now改变每次你怎么称呼它。你不认为这可能是它?

+0

这是一个很好的建议。不幸的是,我不(没有任何奇怪的获得{})。 – Eric

+0

@Eric看我的编辑。这是我唯一能想到的其他事情。 – climbage

+0

哇,我觉得很愚蠢 - 很棒的DateTime.Now。 – Eric

0

我也有这个问题。我有以下情况。我向外部设备发送一个命令,并启动一个定时器来侦听答案。

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

问题是什么?随着断点,我停止了我的代码的聆听。但该设备不断发送信息;而且它确实发送了我一直在寻找的答案,我的代码一直没有在听。

希望这有助于:)

相关问题