1

現在、rhino モックを使用していくつかの単体テストを作成しており、以下のようなテストがあります。ただし、このエラーメッセージが表示され続けます。

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

これは、ラムダ関数が で実行されていないため_dispatcher.BeginInvoke(()=>_osgController.AddWindow)です。Action単体テストでこれを実行するにはどうすればよいですか?

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();
}

テスト対象のクラスは次のとおりです。

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());
    }
}
4

2 に答える 2

1

テストでラムダ関数が実行されていない理由は次のとおりです。

2 つのラムダがあります。

  1. テストメソッドで宣言されたもの:

    Action action = osgController.AddWindow;
    
  2. テスト中のクラスで宣言されたもう1つのもの:

    () => _osgController.AddWindow()
    

それらはまったく同じことを行いますが、異なります。
setup fordispatcher.Expect(d => d.BeginInvoke(action))が に渡される実際のアクションと一致しないのはそのためBeginInvoke()です。その結果、WhenCalled()引数はトリガーされません。

dispatcher.BeginInvoke()解決策の 1 つは、任意のアクションを受け入れて実行するスタブをセットアップすることです。

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

また、ここDo()の代わりに handler を使用できWhenCalled()ます。次に、引数のキャストは必要ありません。

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

それが役立つことを願っています。

于 2013-10-27T07:42:29.577 に答える
0

エラー メッセージの場合:

Rhino Mocks が教えてくれますExpected #1, Actual #0。したがって、一度呼び出されることを期待AddWindowしていますが、まったく呼び出されていません。

設定している 1 つの期待は次のとおりです。

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

問題は何ですか:

メソッドは Dispatcher で呼び出されています。このスレッドはテスト フレームワークで実行されていないため、テストを実行するスレッドを作成する必要があります。

これを設定する方法の例として、コンソールで DispatcherTimer が機能しないことがわかります。

于 2013-10-25T04:13:35.217 に答える