質問

RhinoMockのテストをいくつか設定していますが、期待が失敗する理由がわかりません。

テスト中のクラス/インターフェイスは次のとおりです。

public class LogOn {
    public virtual ILogOn View { get; set; }
    public virtual IDataProvider DataProvider { get; set; }

    public void SetUp(ILogOn view) {
        this.View = view;
        this.DataProvider = ... //using dependancy injection to do the data provider, so I want it faked in tests
    }
    public void SetUpEvents() {

        this.View.Submit += new EventHandler(View_Submit);
    }

    void View_Submit(object sender, EventArgs e) {
        if ( this.DataProvider.LogOn(this.Username) ) {
            this.View.SubmitSuccess();
        } else {
            this.View.SubmitFailure("Username is incorrect");
        }
    }
}

public interface ILogOn {
    string Username { get; set; }
    event EventHandler Submit;
    void SubmitSuccess();
    void SubmitFailure(string message);
}

そして、これが私のテスト方法です:

[TestMethod]
public void LogOnFailure() {
    var dataProvider = MockRepository.CreateStub<DataProvider>();
    var presenter = MockRepository.CreateMock<LogOn>();
    var view = MockRepository.CreateMock<ILogOn>();

    dataProvider.Expect(d => d.LogOn(null)).Return(true).Repeat.Any();

    presenter.Expect(p => p.DataProvider).Return(dataProvider).Repeat.Any();
    presenter.Expect(p => p.View).Return(view).Repeat.Any();
    presenter.Expect(p => p.SetUpEvents()).CallOriginalMethod();

    view.Expect(v => v.Username).Return("invalid").Repeat.Any();
    view.Expect(v => v.SubmitFail(null)).Constraints(Is.Same("Username is incorrect"));

    presenter.SetUp(view);
    presenter.SetUpEvents();

    view.Raise(v => v.Submit += null, null, EventArgs.Empty);

    presenter.VerifyAllExpectations();
    view.VerifyAllExpectations();
}

失敗している期待は次のとおりです:

view.Expect(v => v.SubmitFail(null)).Constraints(Is.Same("Username is incorrect"));

view.VerifyAllExpectations で示される)

このメソッドは決して実行されないが、デバッガーを使用する場合、ステップスルーして LogOn.View にアクセスすると、 SubmitFailure メソッド(引数)と正しく戻ります。

コードを見ると、すべてが適切なタイミングで適切な値で実行されていることを示しているため、不足しているものを見つけることはできません。

編集:OK、だから私は LogOn クラスをモックしていたコードを公開しました。これは外部データプロバイダーに依存しています(これは私が私はそれがどのように動作するか気にしないのでmスタブ)。私の謝罪、私はこれをより明確にしていたと思ったが、ただ作ったのはもっと悪い!

役に立ちましたか?

解決

LogOnクラスはテスト対象のシステムですので、あざける必要はありません。無効なユーザー名の場合にLogOnクラスが正常に動作することをテストする必要があります。必要なシナリオを設定する模擬ビューを渡すことにより、正しい動作を決定できます。テストを以下に変更してみてください。

[TestMethod]
public void LogonFailure()
{
    var presenter = new LogOn();
    var view = MockRepository.CreateMock<ILogOn>();

    view.Expect(v => v.Username).Return("invalid").Repeat.Any();
    view.Expect(v => v.SubmitFail(null)).Constraints(Is.Same("Username is incorrect"));

    presenter.Setup(view);

    view.Raise(v => v.Submit += null, null, EventArgs.Empty);

    view.VerifyAllExpectations();
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top