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)); 
} 
+0

코드는 어떻게 생깁니 까? – ChrisBint

+0

정말 그 중단 점과 관련이 없다고 생각합니다. 중단 점에 도달하면 모든 실행이 중지됩니다. – climbage

+0

그 값을 변경하는 다른 스레드가 있습니까? – MattW

답변

2

당신이 측면에 영향을 미치는 어떤 get {}의이 일이 있습니까? 객체의 상태를 관찰하는 동안 객체의 상태를 변경했을 가능성이 있습니다. 예를 들어

: 당신이 A.one == 1을 주장 할 때

class A { 
    int one = 0; 

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

는 지금, 그것은 실패합니다. 보시면 two == 2one == 1이 표시됩니다. 다시 시도 할 때 A.one을 변경 했으므로 어설 션이 통과됩니다.

편집 :

는 코드를보고, DateTime.Now 변화는 매번 당신은 그것을 호출합니다. 그럴 수 있다고 생각하지 않아?

+0

대단한 제안입니다. 불행히도, 나는 아무 이상한 것을 가지지 않습니다 ({}). – Eric

+0

@Eric 내 편집을 참조하십시오. 그것이 내가 생각할 수있는 유일한 다른 것입니다. – climbage

+0

와우, 나는 어리 석다 - DateTime에 큰 포착을 느낀다. 자. – Eric

0

이 문제도 발생했습니다. 나는 다음과 같은 상황에 처해 있었다. 나는 외부 장치에 명령을 보내고 응답을 듣기 위해 타이머를 시작했다.

중단 점을 사용하지 않은 경우 오류없이 실행 중입니다. 그러나 시간의 약 70 %에서 브레이크 포인트를 사용하면 오류가 발생했습니다.

무엇이 문제입니까? 중단 점으로 인해 코드를 듣지 않았습니다. 그러나 장치는 계속 정보를 보냈습니다. 내 코드가 더 이상 듣지 않을 때 찾고 있던 대답을 보냈습니다.

희망이 있습니다.

관련 문제