2013-08-12 10 views
3

기본적으로 Execute 및 CanExecute에 대해 두 명의 대표를 허용하는 클래스가 있습니다 (간단히하기 위해 MyCustomCommand라고 부릅니다). 이 클래스는 ICommand를 구현합니다. 이렇게하면 XAML에서 바인딩 한 뷰 모델에서 속성을 선언 할 수 있습니다.뷰 모델에 ICommand가 포함 된 경우 모의 단위 테스트

문제점은 ApplyChangesCommand라는 명령 중 하나의 종속성으로 인해 뷰 모델을 모의해야하는 시나리오로 실행되었습니다. 나는 의존성이 아직 나쁜 것임을 확신하지 못합니다. 이 시점에서 상대적으로 필요합니다.

이 종속성 때문에 모의 설정을 사용하여 기본적으로 종속성을 우회하는 "아무 것도하지 않는"콜백을 만듭니다.

뷰 모델을 모의 했으므로 모든 인스턴스 속성은 물론 null입니다. 여기에는 내 명령이 포함됩니다.

간단한 예는 다음과 같습니다 실제로 ApplyChangesCommand의 _somethingToExecute를 호출 할 수 있습니다 모의와 어떤 방법

private void _somethingToExecute; 
public ICommand ApplyChangesCommand { get { return MyCustomCommand(_somethingToExecute, e=>true); } 

있습니까? Callbase는 그것을 잘라 내지 않으며 그것을 할 수있는 다른 방법을 생각할 수 없다.

한 가지 해결 방법은 "_somethingToExecute"를 public으로 만들고 내 테스트에서 ApplyChangesCommand를 만드는 것이지만 팬이 아닙니다.

감사의 말.

+0

내가 묻는 것을 얻기 위해 몇 번 읽어야했기 때문에 여기에서 벗어날 수 있습니다. Command 또는 Command가 포함 된 ViewModel을 테스트 할 때 문제가 있습니까?커맨드 (당신이 묻는 것)가 있다면, 들어오는 델리게이트를 'MyCustomCommand' 생성자로 조롱 할 수 없으며 모의 델리게이트가 호출되었는지 만 확인하면됩니까? 이것은 명령에 대한 정확한 단위 테스트 일 것입니다. ViewModel을 테스트하는 것은 비슷할 것입니다. Command를 모의 해보고 Execute 호출이'_somethingToExecute'를 호출하도록합니다. – Gjeltema

+0

제안 해 주셔서 대단히 감사합니다. 저것을 들여다 보자 ... 올바른 길에있을 것 같은 소리! 보기 모델을 모의하고 있기 때문에 제 문제는 실제로 명령을 테스트하는 단위를 중심으로 회전합니다. View Model이 조롱 되었기 때문에 명령 자체는 null입니다. – tronious

답변

1

확인

덕분에, 지금은 직장에서 돌진되지 않는이 보는 시간을 더 했어, 내가 문제를 참조하십시오. 당신이해야 할 일은 주입 된 공장을 사용하여 ApplyChangesCommand을 만드는 것입니다. 그런 다음 VM을 단위 테스트하려면 명령이 공장에서 만든 명령을 반환하는지 확인해야합니다.

public class MyViewModel 
{ 
    private MyCustomCommandFactory _commandFactory; 
    private void _somethingToExecute; 

    public MyViewModel(MyCustomCommandFactory commandFactory) 
    { 
     _commandFactory = commandFactory; 
    } 

    public ICommand ApplyChangesCommand 
    { 
     get 
     { 
      return _commandFactory.Create(_somethingToExecute, e=>true); 
     } 
    } 
} 

이 새 명령을 (당신이 설정 얼마나 것 같다) 가져 오기가 호출 될 때마다 생성하고자하는 가정 아래는 예입니다. VM의 수명 동안 하나의 명령 만 만들려면 분명히 VM 생성자에서 팩토리를 통해 명령을 만들면됩니다.

[Test] 
public void ApplyChangesCommand_Always_ReturnsFactoryCreatedCommand 
{ 
    Mock<ICommand> mockCreatedCustomCommand = new Mock<ICommand>(); 
    Mock<MyCustomCommandFactory> mockCommandFactory = new Mock<MyCustomCommandFactory>(); 
    mockCreatedCustomCommand.Setup(p => p.Create(It.IsAny<Action>(), e => true)) 
          .Returns(mockCreatedCustomCommand.Object); 
    Assert.That(systemUnderTest.ApplyChangesCommand, Is.SameAs(mockCreatedCustomCommand.Object)); 
} 

(대리인이 실제로 무엇을 위해 밖으로 변경 Action) : 단위 테스트이 작업을하려면

, 당신은 같은 것을 할 수 있습니다.

이것은 VM 명령에 대한 단위 테스트에 필요한 모든 것입니다. 해당 동작이 예상 한 동작인지 테스트하려는 경우 (즉, 전달 된 대리자를 실행하고 해당 대리자를 사용하여 예상 된 값을 반환 함) 수용 테스트의 영역입니다.

참고 : 테스트 예에서는 Moq 조롱 프레임 워크 구문을 사용했습니다.

개인적으로, 나는 그러한 대표를 Command으로 전달하지 않을 것입니다. 대신 Command에 필요한 것을 주입하고 Command 안에 모든 로직을 가지고 있습니다. 여기서 더 쉽게 단위 테스트를 거치고 VM에 대한 의존도가 낮아집니다.