1

だから私はサイのモックに慣れていないので、私が取り組んでいるMVPパターン化されたプロジェクトでそれを始めようとしています。したがって、ビューを表すインターフェイスとプレゼンターのクラスを次のように取得しました。

public interface IView {
  string SomeData { get; set; }
}

public class Presenter {
  public IView View { get; set; }
  public void Init(IView view) {
    this.View = view;
  }

  public virtual string DoStuff(){
    return "Done stuff with " + this.View.SomeData;
  }
}

そして、メソッドをモックするテストをセットアップしようとしているDoStuffので、次のような基本的なフィクスチャがあります。

[TestMethod]
public void Test(){
  var mocks = new MockRepository();
  var view = mocks.Stub<IView>();
  var presenter = mocks.StrictMock<Presenter>();

  presenter.Init(view);

  using(mocks.Record()){
    presenter.Expect(p => p.DoStuff()).Return("Mocked result");
  }

  string result = string.Empty;
  using(mocks.Playback()){
    result = presenter.DoStuff();
  }

  Assert.AreEqual(result, "Mocked result");
}

しかし、View オブジェクトが null であるため、メソッド内から(期待値のセットアップ中に) null 参照例外が発生し続けます。DoStuffそして、これは私が立ち往生しているところです。Initプロパティの値を割り当てるメソッドを呼び出しましたViewが、メソッド自体が呼び出されなかったことが期待設定のポイントだと思いましたか?

4

4 に答える 4

8

Rhino Mocks をテストしているようです。ビューとプレゼンターの両方を嘲笑しています。プレゼンターを嘲笑することは望ましくなく、ビューだけを嘲笑する必要があると仮定します。

于 2009-01-08T06:37:26.580 に答える
2

モック化されたプレゼンターで Init メソッドを呼び出す代わりに、View プロパティもモック化する必要があります。

presenter.Expect( p => p.View ).Return( view );

RhinoMocksの新しいAAA (Arrange-Act-Assert) 構文を使用することも検討してください。

string expectedResult = "Done stuff with Mocked Result";

var view = MockRepository.GenerateMock<IView>();
view.Expect( v => v.SomeData ).Return( "Mocked Result" );

var presenter = new Presenter();
presenter.Init( view );

string actualResult = presenter.DoStuff();

Assert.AreEqual( expectedResult, actualResult );

view.VerifyAllExpectations();

EDIT これをもう一度見た後、プレゼンターではなくビューをモック/スタブするだけでよいという@ayendeに同意します。コードを機能させるために元の修正を残しますが、後者を反映するように例を更新します。

于 2009-01-08T03:24:19.433 に答える
0

あなたのソースコードとあなたのテストから、あなたが実際に何をテストしようとしているのかを理解するのは難しいです. 景色?プレゼンター?

ビューのインターフェイスとプレゼンターのクラス実装があるので、ビューをモックしてプレゼンターをテストしたいと思います。

これがグループサイトです(この質問へのリンクを投稿しました):

http://groups.google.com/group/RhinoMocks

このコードを参照してください。2007年のものですが、嘲笑の要点をつかむことができます。

http://tech.groups.yahoo.com/group/AgileEmbedded/files/HomeGuard/

于 2009-01-08T06:23:03.597 に答える
0

他の人が書いているように、テストしようとしているコードを決定し、他のものだけをモックする必要があります。プレゼンターをテストしようとしている場合は、実際のプレゼンターを使用しながらビューをモック/スタブアウトするだけです。このようなもの:

[TestMethod]
public void Test(){
  var view = MockRepository.GenerateStub<IView>();
  var presenter = new Presenter();
  presenter.Init(view);
  view.SomeData = "Test";
  Assert.AreEqual(presenter.DoStuff(), "Done stuff with Test");
}

次に、Presenter.DoStuff() メソッドがビューを正しく使用することをテストしています。

お役に立てれば。

于 2009-01-08T06:59:59.467 に答える