我对这里发生的事情有点困惑。我正在查看 Atomic Object 中的 Puzzle 示例,展示如何测试 Model-View-Presenter 模式Puzzle.zip
视图有一个私人事件。该视图还有一个订阅(delegate) 函数,用于将委托添加到事件中。Presenter 在 IView 和 IModel 中传递。在构建期间,它订阅视图并将其连接到模型上的函数。
为了对 Presenter 进行单元测试,使用 NMock 模拟 View 类。所以它只是一个愚蠢的类,Subscribe() 函数实际上并没有做任何事情。当然,要测试presenter,你必须模拟视图和模型,然后在视图中触发事件并确保调用了模型函数。示例代码工作得很好 - 但是,我不明白它是如何工作的!
部分摘录:
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);
}
不知何故,“触发器(点)”调用实际上连接到视图,并导致视图中的私有事件触发。我不知道它是如何工作的——我看不到它与视图实例的连接位置。我错过了什么?
更新: 我正在尝试使用 NMock 2。看来 moveRequestConstraint 变量接收到在 TestSetup 函数中传递给 SubscribeMoveRequest() 的值。但是,那是 NMock 1 语法 - 而 NMock 2 似乎不支持该语法。我将如何使用 NMock 2 做到这一点?