2012-07-13 3 views
1

방금 ​​Jason Dolinger's video on MVVM을 보았습니다. 그리고 올바르게 설정하고 단위 뷰 테스트 모델의 ICommand 속성을 테스트하는 방법에 대한 설명이 필요합니다.뷰 모델에서 메서드 또는 명령을 단위 테스트해야합니까?

FooBarCommand ICommandProperty를 사용하여 다음 ViewModel 클래스를 고려하십시오.

public class ViewModel : IViewModel 
{ 
    public ICommand FooBarCommand { get; private set; } 

    public bool CanExectuteFooBar() 
    { 
     return true; 
    } 

    public void FooBar() 
    { 
     //Do some FooBarish stuff 
    } 
} 

public interface IViewModel 
{ 
    void FooBar(); 
    System.Windows.Input.ICommand FooBarCommand { get; } 
} 

public class FooBarCommand : ICommand 
{ 
    private ViewModel vm; 

    public FooBarCommand(ViewModel vm) 
    { 
     this.vm = vm; 
    } 
    public bool CanExecute(object parameter) 
    { 
     return vm.CanExectuteFooBar(); 
    } 

    public event EventHandler CanExecuteChanged; 

    public void Execute(object parameter) 
    { 
     vm.FooBar(); 
    } 
} 

그래서 testVM.FooBar()를 호출하거나 testVM.FooBarCommand.Execute를 호출하여 명령을 실행하여 하나 내가 FOOBAR를 실행할 수의 ViewModel의 FOOBAR 기능을() 테스트 단위 해요 경우(). 어느 쪽이 좋을까요? 궁극적으로 뷰의 단추가 FooBarCommand 속성에 바인딩되어 FooBarCommand 속성을 테스트하지 않고 있습니다.

또한 뷰가 ViewModel이 아닌 IViewModel에 바인딩되므로 IViewModel 인터페이스의 FooBar() 메서드를 완전히 수정해야합니다.

+0

는) – blindmeis

+0

아 그래 내가 예를했을 때 나는 그것에 대해 생각하지 않았습니다 알고있다. 나는 지금 그 문제에서 그것을 고쳤다. –

+0

FooBar 메서드를 인터페이스에서 제거하는 것이 옳습니다. 메서드와 CanExecute 메서드는 실제로 내부적 일 수 있습니다. 메소드 대 테스트를 시작하면 클래스의 private 구현과 공용 "인터페이스"를 테스트하는 것과 다르지 않습니다. 뷰 모델의 소비자는 명령에서만 작동하기 때문입니다. – Rich

답변

0

왜 DelegateCommand 또는 RelayCommand를 사용하지 않습니까? 만약 당신이 그렇게한다면 Comand 그 자체 만 공개되기 때문에이 질문을하지 않아도됩니다. canexecute와 execute 메소드는 비공개입니다.

그리고 우리는 공공 물건을 unittest해야합니다.

ps : 질문에 대한 내 의견을 놓치지 마시고, MessageBox 대신 IMessageBoxService를 직접 viewmodels에 사용하십시오.

0

명령 뒤에 논리가 있기 때문에 명령을 테스트하는 것이 다른 테스트 픽스처 일 수 있습니다 (사용 안 함 단추 사용). CanExecute 메서드에서만 true를 반환하면 명령을 단위 테스트하는 데 사용할 수 없지만 비활성화 가능 단추에 복잡한 논리가 포함되어 있으면 다른 고정 장치에서 테스트해야합니다.

노트 (동의하지 않을 경우 무시) :

  1. 시도 순환 참조를 최소화 relay command 중 하나를 사용하여보다 명령에 VM을 통과하기 위해 항상 최선의 방법입니다.
  2. 결코 참조 테스트 할 수없는 개체을 VM에 (보기 - 메시지 상자, 복잡한 종속성 트리가있는 큰 개체 등 포함). 당신은 당신이 그렇지 않으면 당신은 문제가되는 IMessageboxService로 System.Windows.MessageBox.Show를 교체해야합니다 당신의 ViewModel 유닛 테스트하려는 경우
관련 문제