2013-10-25 2 views
1

저는 현재 rhino mock으로 단위 테스트를 만들고 있는데 아래에 보이는 테스트가 있습니다. 그러나이 오류 메시지, _dispatcher.BeginInvoke(()=>_osgController.AddWindow)에서 실행되지 람다 함수에 의한Rhino Mock 객체의 일부인 메서드에서 람다 함수를 어떻게 실행합니까?

IOsgController.AddWindow(Whiteboard.Model.OsgWindowProps); Expected #1, Actual #0. 

가 계속. 내 장치 테스트에서 이걸 Action 실행하려면 어떻게해야합니까? 오류 메시지에 대한

public class OsgViewModel : ViewModelBase 
{ 
    private readonly IOsgController _osgController; 
    private readonly IDispatcher _dispatcher; 

    public OsgViewModel(IOsgController osgController, IDispatcher dispatcher) 
    { 
     _osgController = osgController; 
     _dispatcher = dispatcher; 
     LoadCommand = new RelayCommand(LoadControl); 
    } 

    public ICommand LoadCommand { get; set; } 

    public void LoadControl() 
    { 
     // lambda is not being executed in unit test. 
     _dispatcher.BeginInvoke(
      () => _osgController.AddWindow()); 
    } 
} 

답변

1

람다 기능 테스트에서 실행되고 있지 않은 이유는 다음과

  1. 시험 방법에 선언 하나

    Action action = osgController.AddWindow; 
    
  2. 테스트중인 클래스에서 선언 된 다른 하나 :

    () => _osgController.AddWindow() 
    

정확히 동일하지만 다르다.
dispatcher.Expect(d => d.BeginInvoke(action))에 대한 설정이 BeginInvoke()에 전달 된 실제 작업과 일치하지 않는 이유가 여기에 있습니다. 결과적으로 WhenCalled() 인수가 트리거되지 않습니다.

솔루션들 중 하나는 동작을 허용 dispatcher.BeginInvoke() 스텁 셋업하는 것이며 단지 실행 :

또한
dispatcher 
    .Stub(d => d.BeginInvoke(Arg<Action>.Is.Anything)) 
    .WhenCalled(opt => ((Action)(opt.Arguments[0]))()); 

Do() 핸들러 대신 WhenCalled() 여기에 사용될 수있다. 그런 다음 인수가 필요하지 않습니다.

dispatcher 
    .Stub(d => d.BeginInvoke(Arg<Action>.Is.Anything)) 
    .Do((Action<Action>)(action => action())); 

희망이 있습니다.

0

: 시험

public void the_load_command_is_triggered_which_executes_the_load_control_method() 
{ 
     // arrange 
     IOsgController osgController = MockRepository.GenerateMock<IOsgController>(); 
     IDispatcher dispatcher = MockRepository.GenerateMock<IDispatcher>(); 
     Action action = osgController.AddWindow; 
     OsgViewModel osgViewModel = new OsgViewModel(osgController, dispatcher); 

     // dispatcher and add window should be called in LoadControl 
     dispatcher.Expect(d => d.BeginInvoke(action)).WhenCalled(i => action()); 
     osgController.Expect(x => x.AddWindow()); 

     // act 
     osgViewModel.LoadCommand.Execute(new object()); 

     // assert 
     osgController.VerifyAllExpectations(); 
} 

클래스는

코뿔소 모의 객체는 당신에게 Expected #1, Actual #0을 말하고있다. 따라서 AddWindow은 한 번 호출 될 것으로 예상되지만 전혀 호출되지 않습니다. 당신이 설정을 가지고

한 기대는 다음과 같습니다 문제가 무엇인지에 관해서는

osgController.Expect(x => x.AddWindow(osgViewModel.WindowProperties)); 

:

귀하의 방법은 디스패처에서 호출되고있다. 이 스레드는 테스트 프레임 워크에서 실행되지 않으므로 테스트를 실행하기 위해 스레드를 생성해야합니다.

이 방법을 설정하는 방법에 대한 예제는 DispatcherTimer doesn't work in Console을 참조하십시오.

2 람다있다 :

+0

답변 해 주셔서 감사합니다. 실제로 주입 된 IDispatcher 인터페이스이며 생각하고있는 WPF 응용 프로그램 디스패처는 아닙니다.문제는 BeginInvoke 메서드에 전달되는 람다 함수가 실행되고 있지 않다는 것입니다. – Seth

관련 문제