2009-12-08 34 views
8

Tôi đang phát triển các ứng dụng WPF sử dụng mẫu MVVM. Tôi có ViewModel với mã như thế này:PropertySanged event testing: đây có phải là cách hay không?

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

OnPropertyChanged là phương thức ảo của lớp cơ sở mà chỉ nâng PropertyChanged sự kiện. Tôi muốn thử nghiệm PropertyChanged sự kiện nâng cao và có phương pháp thử nghiệm của tôi:

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")); 
    ... 
} 

có phải là một cách tốt để kiểm tra sự kiện ProprtyChanged?

Trả lời

10

Tôi sử dụng little Fluent API để thực hiện chính xác điều đó. Nó cho phép bạn viết bài kiểm tra như thế này:

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

Bên cạnh việc gọn gàng, tôi thích phương pháp này vì nó là loại an toàn - không có giá trị chuỗi để giữ đồng bộ với API của bạn.

Để kiểm tra xem sự kiện có đang được nâng lên cho nhiều thuộc tính hay không, bạn chỉ có thể viết một thử nghiệm khác thực hiện điều này. Điều này sẽ cung cấp cho bạn nhiều bài kiểm tra, nhưng mỗi bài kiểm tra sẽ rất nhỏ và bạn tránh được Assertion Roulette.

+0

Đó là tuyệt vời! Cảm ơn bạn. – bniwredyc

+1

Các công cụ tốt ... Tôi sắp viết trình bao bọc của riêng mình, nhưng tôi nghĩ tôi sẽ kiểm tra SO trước, và voilà ... ở đây là> 8) Tôi đã chỉnh sửa giải pháp của bạn một chút để sử dụng xUnit. Cảm ơn! –

1

Tôi tin rằng bạn nên kiểm tra sự kiện PropertyChanged trong ví dụ bạn đã hiển thị. Bạn có thể đã viết sai tên chuỗi thuộc tính mà sẽ dẫn đến một bản cập nhật bị thiếu.

Với WPF Application Framework (WAF) nó rất dễ dàng để viết như một bài kiểm tra đơn vị:

Person person = new Person(); 
AssertHelper.PropertyChangedEvent(person, x => x.Name,() => person.Name = "Luke"); 
Các vấn đề liên quan