2012-03-14 34 views
5

Tôi là một "người mới bắt đầu" tại TDD, và cái gì tôi đang cố gắng tìm là làm thế nào để đơn vị kiểm tra viewmodels ...Testing ViewModel PropertyChanged Sự kiện

Tôi muốn chắc chắn rằng một sự kiện bất động sản ProeprtyChanged là bắn. .. Tôi có bài kiểm tra sau đây bằng cách sử dụng nunit.

[Test]   
public void Radius_Property_Changed() 
{ 
    var result = false; 
    var sut = new MainViewModel(); 
    sut.PropertyChanged += (s, e) => 
    { 
     if (e.PropertyName == "Radius") 
     { 
      result = true; 
     } 
    }; 

    sut.Radius = decimal.MaxValue; 
    Assert.That(result, Is.EqualTo(true)); 
} 

Đây có phải là cách sạch để làm điều này, hoặc là có một cách tốt hơn để kiểm tra khách sạn này

... đoạn mã trong viewmodel của propety Tôi đang thử nghiệm vẻ như thế này .. .

public decimal Radius 
{ 
    get { return _radius; } 
    set 
    { 
     _radius = value; 
     OnPropertyChanged("Radius"); 
    } 
} 

Trả lời

4

Đây là cách bạn làm điều đó khá nhiều. Không còn gì khác để làm ở đây vì nó khá đơn giản (và nhàm chán). Nó có thể là giá trị để bọc trong thư viện/công cụ tái sử dụng của riêng bạn. Hoặc thậm chí tốt hơn, use existing code.

+0

Tôi đã refactored nó để sử dụng [TestCase] ​​và làm cho nó chung chung hơn ... thanks for the gợi ý –

1

Thử nghiệm "tối thiểu" của riêng tôi cho loại điều này hơi khác một chút. Thay vì kiểm tra xem sự kiện có được nâng lên hay không, tôi thường xác minh rằng số tiền đó được nâng lên chính xác một lần. testing framework

+0

Tốt điểm - một cái gì đó đáng giá –

1

Granite của phép bạn viết bài kiểm tra như thế này:

[TestMethod] 
    public void ChangeTrackingModelBase_BasicFunctionalityTest() 
    { 
     var person = new ChangeTrackingPerson(); 
     var eventAssert = new PropertyChangedEventAssert(person); 

     Assert.IsNull(person.FirstName); 
     Assert.AreEqual("", person.LastName); 

     eventAssert.ExpectNothing(); 

     person.FirstName = "John"; 

     eventAssert.Expect("FirstName"); 
     eventAssert.Expect("IsChanged"); 
     eventAssert.Expect("FullName"); 

     person.LastName = "Doe"; 

     eventAssert.Expect("LastName"); 
     eventAssert.Expect("FullName"); 

     person.InvokeGoodPropertyMessage(); 
     eventAssert.Expect("FullName"); 

     person.InvokeAllPropertyMessage(); 
     eventAssert.Expect(""); 

    } 

http://granite.codeplex.com/SourceControl/list/changesets

Nó dựa trên MSTest, nhưng bạn có thể dễ dàng viết lại nó để làm việc với NUnit.

+0

Cảm ơn, tôi sẽ kiểm tra Granite - đây trông giống như một bài kiểm tra tích hợp với tôi, nhưng chắc chắn một cái gì đó tôi muốn bao gồm –

+0

Kiểm tra tích hợp? Không, nó không nói đến bất kỳ dịch vụ hoặc cơ sở dữ liệu mở rộng nào. –

0

Tôi đã thực hiện một lớp đơn giản mà bạn có thể sử dụng cho việc này: github

Nó sử dụng phản ánh thạch để xác định nếu một thay đổi sự kiện bất động sản đã được nâng lên khi giá trị được thiết lập của một tài sản công cộng.

Ví dụ:


[TestMethod] 
public void Properties_WhenSet_TriggerNotifyPropertyChanged() 
{ 
    new NotifyPropertyChangedTester(new FooViewModel()).Test(); 
} 
Các vấn đề liên quan