2009-11-10 2 views
1

이벤트가 발생했다는 주장을 테스트 할 수 있습니까? 이런 식으로 뭔가 : 나는이 이벤트 핸들러를 만들 수 물론이벤트에 어서션을 넣는 방법이 있습니까?

[TestMethod] 
public void EventFiresWhenChangingProperty() 
{ 
    var sut = new SystemUnderTest(); 
    var eventRegister = new EventRegister(sut.PropertyChanged); 
    sut.AnyProperty = "new value"; 
    Assert.EventWasFired(eventRegister); 
} 

, 즉 테스트 컨텍스트에 또는 이러한 특정 시험에 의해 읽어 인스턴스 변수에 몇 가지 기록을두고 있지만, 이것은 조금 너무 많은 배관을 보인다 . 위의 코드와 같은 것을 찾고 있습니다.

답변

4

는 평소에는 이벤트 리스너로 익명 방법 후크 등 마찬가지로에서 검증 값을 설정 : 배관의 최소량을 제공

var sut = new SystemUnderTest(); 
bool eventWasRaised = false; 
sut.PropertyChanged += (s, e) => eventWasRaised = true;  
sut.AnyProperty = "new value"; 
Assert.IsTrue(eventWasRaised); 

. 당신은 몇 가지 청소를 추가 할 경우, 이벤트 핸들러를 들고 변수를 만들 수 있습니다

var sut = new SystemUnderTest(); 
bool eventWasRaised = false; 
EventHandler eh = (s, e) => eventWasRaised = true; 
sut.PropertyChanged += eh; // attach event handler 
sut.AnyProperty = "new value"; 
Assert.IsTrue(eventWasRaised); 
sut.PropertyChanged -= eh; // detach event handler 
+0

좋은 하나. 익명 메소드를 사용하여 무언가를하는 것에 대한 아이디어를 이미 위에 쓰고있을 때, 이미 내 머리 속에서 ... 그러나 매우 추상적 인 모습을하고 있습니다. –

0

처음에는 이벤트에 리스너를 추가하는 코드가 "불필요한 배관"코드 인 것 같지만 실제로 이벤트를 테스트하기 위해 그렇게해야한다고 생각합니다.

원하는대로 할 수있는 조롱 프레임 워크가 있지만 코드에 추가 종속성이 추가됩니다.

간단하게 유지하십시오. 이벤트에 가입하십시오.

0

내가 프레드릭 Mörk의 솔루션에 동의를하고 공정하게 자주 사용합니다. 한 가지 유의 사항 : 이벤트 핸들러가 시작될 수있는 충분한 시간을 확보하기 위해 트리거링 작업 후 최소 20-30 밀리 초의 Sleep을 삽입하는 것이 가장 좋습니다. 때로는 경쟁 조건이 발생했습니다.

관련 문제