2009-03-11 7 views
5

WPF 응용 프로그램에서 작업 중이며 ModelViewViewModel 디자인 패턴을 사용하고 있습니다. 보기에서 벗어나서 ViewModel 활동을 유발하는 많은 이벤트가 있습니다.WPF MVVM 및 단위 테스트

UnitTest에서 이러한 이벤트를 발생시키는 방법은 무엇입니까? 예를 들어, 드롭 이벤트를 시뮬레이트하고 싶습니다. 스텁 뷰를 만들고 싶지는 않지만 이벤트를 발생시키기 위해서입니다.

모든 의견을 환영합니다.

감사합니다.

답변

1

ViewModel 클래스에서 직접 drop 이벤트에 대한 이벤트 처리기를 사용하는 것처럼 들립니다. UI 레이어에 핸들러를 두는 것이 더 바람직할까요? 차례대로 ViewModel에서 함수를 호출할까요? 이 방법을 사용하면 단위 테스트에서 함수를 호출 할 수 있습니다 (ViewModel에 관한 한 드래그 앤 드롭 작업을 시뮬레이트합니다).

또한 ViewModel과 UI 코드를 분리하는 것이 좋습니다.

16

MVVM 패턴에있어서, 상기 뷰는 뷰 모델에 대해 알고

  • - 그것에 대한 참조를해야합니다 어느 구체적인 인스턴스 또는 인터페이스로
  • 뷰 모델은 뷰에 대해 알고 안 모든.

    1 :   당신의 ViewModel에 명령을 노출하고, 그것을 실행하는 데 데이터 바인딩을 사용하여 이벤트를 처리 할 필요가 있다면, 그것을 할 내가 알고있는 두 가지 방법이

있습니다. 이렇게하면

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

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

그때 당신은 단순히 수동으로 myViewModel.ClickCommand.Execute를 호출하여 명령을 테스트 할 수 있습니다 : 이것은 내 선호하는 방법, 예를 들면이다.

2 :  는, 뷰 모델의 기능을 노출하고, 쓰기 최소한으로.xaml.cs 파일의 이벤트를 처리하고 함수를 호출 예 :

class MyViewModel 
{ 
    public void HandleClick(){ } 
} 

<Button Click="MyClickHandler"> 

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

이렇게 할 경우, 그러면 myViewModel.HandleClick을 수동으로 호출하여 테스트 할 수 있습니다. MyClickHandler 코드를 단 하나의 코드로 테스트하는 데 신경 쓸 필요가 없습니다.

0

이벤트를 발생시키지 마십시오. 핸들러를 호출하면됩니다. 즉, 이벤트 핸들러는 public이어야하며 이벤트 핸들러 중심 인수가 적을 수 있습니다. "조치"를 사용하여 Caliburn (http://www.codeplex.com/caliburn)에서 이것이 어떻게 수행되는지 확인하십시오.