2009-12-08 2 views
8

MVVM 패턴을 사용하여 WPF 응용 프로그램을 개발 중입니다. 나는 다음과 같은 코드로 뷰 모델이 있습니다PropertyChanged 이벤트 테스트 : 좋은 방법입니까?

public bool EditModeEnabled 
{ 
    get { return _EditModeEnabled; } 
    set 
    { 
     _ModeEditModeEnabled = value; 
     OnPropertyChanged("EditModeEnabled"); 
     OnPropertyChanged("CommentTextBoxVisibility"); 
    } 
} 

OnPropertyChanged 그냥 PropertyChanged 이벤트를 발생 기본 클래스의 가상 방법이다. 이 ProprtyChanged 이벤트를 테스트 할 수있는 좋은 방법

public void EditModeEnabledTest() 
{ 
    var imageViewModel = TestHelper.GetTestImageViewModel(); 
    var firedEvents = new List<string>(); 
    imageViewModel.PropertyChanged += ((sender, e) => firedEvents.Add(e.PropertyName)); 
    imageViewModel.Mode = true; 
    Assert.AreEqual(firedEvents.Count, 2); 
    Assert.IsTrue(firedEvents.Contains("EditModeEnabled")); 
    Assert.IsTrue(firedEvents.Contains("CommentTextBoxVisibility")); 
    ... 
} 

인가 : 나는 내 테스트 방법이 제기 PropertyChanged 이벤트를 테스트하고 싶어?

답변

10

저는 정확히 이것을하기 위해 little Fluent API을 사용합니다. 그것은 당신이 이런 식으로 테스트를 작성 할 수 있습니다 :

var imageViewModel = TestHelper.GetTestImageViewModel(); 
imageViewModel.ShouldNotifyOn(s => s.EditModeEnabled) 
    When(s => s.Mode = true); 

간결되고 게다가이 입력 안전이기 때문에, 나는이 방법을 선호하는 - 아니 문자열 값이 API와 동기화 유지 없습니다.

두 개 이상의 속성에 대해 이벤트가 발생하는지 테스트하려면이 작업을 수행하는 다른 테스트를 작성하면됩니다. 이것은 많은 테스트를 제공 할 것이지만 각각은 매우 작을 것이므로 Assertion Roulette을 피하십시오.

+0

다음 WPF Application Framework (WAF)

는 같은 단위 테스트를 작성하는 것은 매우 쉽습니다! 고맙습니다. – bniwredyc

+1

좋은 물건 ... 나는 내 자신의 래퍼를 작성하려했으나, 우선 내가 먼저 확인해 보았다고 생각했다 ... 여기있다.> 8) xUnit을 사용하기 위해 솔루션을 약간 수정했다. 감사! –

1

표시 한 예에서 PropertyChanged 이벤트를 단위 테스트하는 것이 좋습니다. 잘못된 속성 이름 문자열을 작성하여 업데이트가 누락되었을 수 있습니다. 끝내

Person person = new Person(); 
AssertHelper.PropertyChangedEvent(person, x => x.Name,() => person.Name = "Luke"); 
관련 문제