ここで何が起こっているのか少し混乱しています。Model-View-PresenterパターンPuzzle.zipをテストする方法を示すAtomicObjectのパズルの例を見ています。
ビューにはプライベートイベントがあります。ビューには、イベントにデリゲートを追加するSubscribe(delegate)関数もあります。プレゼンターはIViewとIModelで渡されます。構築中に、ビューをサブスクライブし、モデル上の関数に接続します。
プレゼンターの単体テストでは、ViewクラスはNMockを使用してモックされます。したがって、これは単なるダムクラスであり、Subscribe()関数は実際には何もしません。もちろん、プレゼンターをテストするには、ビューとモデルをモックアップしてから、ビューでイベントをトリガーし、モデル関数が呼び出されたことを確認する必要があります。サンプルコードは問題なく動作しますが、どのように動作するのかわかりません!!
いくつかの抜粋:
private DynamicMock modelMock;
private IPuzzleModel model;
private DynamicMock viewMock;
private IPuzzleView view;
private SavedTypeOf moveRequestConstraint;
[SetUp]
public void SetUp()
{
modelMock = new DynamicMock(typeof(IPuzzleModel));
modelMock.Strict = true;
model = modelMock.MockInstance as IPuzzleModel;
// Setup the view
viewMock = new DynamicMock(typeof(IPuzzleView));
viewMock.Strict = true;
view = viewMock.MockInstance as IPuzzleView;
moveRequestConstraint = new SavedTypeOf(typeof(PointDelegate));
viewMock.Expect("SubscribeMoveRequest", moveRequestConstraint);
// create the presenter
new PuzzlePresenter(model, view);
}
[Test]
public void test_MoveRequest_fromView()
{
Point point = new Point(1, 2);
modelMock.Expect("MoveRequest", point);
PointDelegate trigger = moveRequestConstraint.GetInstance as PointDelegate;
trigger(point);
}
どういうわけか、「trigger(point)」呼び出しは実際にビューに接続されており、ビュー内のプライベートイベントをトリガーしています。これがどのように機能しているかわかりません-ビューインスタンスに接続されている場所がわかりません。私は何が欠けていますか?
更新: NMock 2を使用しようとしています。moveRequestConstraint変数は、TestSetup関数のSubscribeMoveRequest()に渡される値を受け取っているようです。ただし、これはNMock 1構文であり、NMock2はその構文をサポートしていないようです。NMock 2でどのようにそれを行いますか?