【发布时间】:2009-08-21 10:38:39
【问题描述】:
我在测试这个场景时遇到了问题。
发票有两种状态 - 已完成和未完成 - 我想测试 Presenter.FinishInvoice() 方法调用 DAO.FinishInvoice() 然后调用 DAO.GetInvoice() 并使用结果设置 View.Invoice。问题是我首先需要调用 DAO.GetInvoice() 来完成发票,这是从 Presenter.InitializeView() 调用的(在另一个测试中测试)。
这是我的测试:
using (mocks.Record())
{
SetupResult.For(view.Invoice).PropertyBehavior();
SetupResult.For(DAO.GetInvoice(1)).Return(invoice);
Expect.Call(DAO.FinishInvoice(1)).Return(true);
Expect.Call(DAO.GetInvoice(1)).Return(invoice);
}
using (mocks.Playback())
{
Presenter presenter = new Presenter(view, DAO);
presenter.InitializeView(1);
presenter.FinishInvoice();
}
当 InitializeView() 被调用时,DAO.GetInvoice() 将被调用并且 View.Invoice 被设置一次。它不是测试的一部分,但如果我不将 View.Invoice 设置为未完成的发票,则 FinishInvoice() 将失败,因此需要设置返回值。
对 DAO.GetInvoice() 的第二次调用是从 FinishInvoice() 调用的,是测试的一部分。
如果我运行这个测试,DAO.GetInvoice(1); 会失败。预期 #1,实际 #0。我已经单步执行了代码,它在调用 FinishInvoice() 时确实调用了 DAO.GetInvoice(),所以它一定是我的测试代码有问题,而不是我的演示者代码。
如果我改变:
SetupResult.For(DAO.GetInvoice(1)).Return(invoice);
到:
Expect.Call(DAO.GetInvoice(1)).Return(invoice);
它可以工作,但这不应该是测试的一部分,因为它只是设置所需要的(但不能放在 SetUp 方法中,因为它不是所有测试都需要的)
我想我需要用 Expect.Call() 来做这不是一场灾难,但我想学习如何设置它。
【问题讨论】:
标签: unit-testing rhino-mocks mvp