2009-03-11 35 views
5

Tôi đã làm việc trên một ứng dụng WPF và tôi đang sử dụng mẫu thiết kế ModelViewViewModel. Tôi có một số sự kiện xuất hiện, điều này dẫn đến hoạt động ViewModel.WPF MVVM và Kiểm thử Đơn vị

Cách cộng hưởng để có được những sự kiện này được nêu ra từ UnitTest là gì? Ví dụ, tôi muốn mô phỏng sự kiện thả. Tôi không thực sự muốn xây dựng một cái nhìn sơ khai, chỉ để nâng cao sự kiện.

Mọi đề xuất đều được chào đón.

Cảm ơn.

Trả lời

1

Có vẻ như bạn có trình xử lý sự kiện cho sự kiện thả trực tiếp trong lớp ViewModel của mình. Nó sẽ có ý nghĩa hơn để có handler trong lớp UI của bạn, mà lần lượt sẽ gọi một hàm trong ViewModel của bạn? Bằng cách này, kiểm tra đơn vị của bạn chỉ có thể gọi hàm (mô phỏng một hoạt động kéo và thả, theo như ViewModel có liên quan).

Ngoài ra, tốt hơn nên tách ViewModel khỏi mã giao diện người dùng của bạn.

16

Theo mô hình MVVM:

  • The View biết về ViewModel - nó sẽ có một tham chiếu đến nó hoặc là một trường hợp cụ thể hoặc một giao diện
  • ViewModel nên không biết gì về quan điểm tại tất cả các.

Nếu bạn cần để xử lý các sự kiện, sau đó có hai cách mà tôi biết để làm điều đó:

1:   Expose một lệnh trong viewmodel của bạn, và sử dụng liên kết dữ liệu để kích hoạt nó. Đây là cách ưa thích của tôi, ví dụ:

class MyViewModel 
{ 
    public ICommand ClickCommand { get; set; } 
} 

<Button Command="{Binding Path=ClickCommand}" /> 

Nếu bạn làm điều này thì bạn có thể kiểm tra lệnh bằng cách chỉ cần gọi myViewModel.ClickCommand.Execute theo cách thủ công.

2:   Expose một hàm trong viewmodel, và viết tuyệt đối tối thiểu trong file .xaml.cs để xử lý sự kiện này và gọi hàm, ví dụ:

class MyViewModel 
{ 
    public void HandleClick(){ } 
} 

<Button Click="MyClickHandler"> 

//.xaml.cs file 
public void MyClickHandler(Object sender, EventArgs e) { 
    m_viewModel.HandleClick() 
} 

Nếu bạn làm điều này, sau đó bạn có thể kiểm tra bằng cách chỉ cần gọi myViewModel.HandleClick theo cách thủ công. Bạn không cần phải bận tâm với đơn vị kiểm tra mã MyClickHandler vì nó chỉ có 1 dòng!

0

Không tăng sự kiện, chỉ cần gọi các trình xử lý (có nghĩa là các trình xử lý phải công khai và có thể lấy ít đối số trung tâm xử lý sự kiện). Kiểm tra cách thực hiện điều này trong Caliburn (http://www.codeplex.com/caliburn) bằng cách sử dụng "Hành động".

0

Tại sao bạn không sử dụng khung mocking, chẳng hạn như Moq? Kiểm tra bắt đầu nhanh chóng của họ, nó có một mẫu về các sự kiện chế nhạo. Url là: http://code.google.com/p/moq/wiki/QuickStart

Các vấn đề liên quan