假设这appraisalOrderService
是一个接口(在适当架构的应用程序中是一个安全的假设),您的控制器将其作为构造函数注入,您可以使用您最喜欢的模拟框架轻松模拟它。例如,使用 Rhino Mocks,您的测试可能如下所示:
[TestMethod]
public void AppraisalOrderIsAcceptedByEmployee_Should_Redirect_To_VerifyOrderDetails_Action_If_SubmitAppraisalOrder_Throws_A_MessageLoneException()
{
// arrange
var appraisalOrderId = 5;
var orderServiceMock = MockRepository.GenerateMock<IOrderService>();
orderServiceMock
.Expect(x => x.SubmitAppraisalOrder(appraisalOrderId))
.Throw(new MessageLoneException());
var sut = new MyController(orderServiceMock);
// act
var actual = sut.AppraisalOrderIsAcceptedByEmployee(appraisalOrderId);
// assert
Assert.IsInstanceOfType(actual, typeof(RedirectToRouteResult));
Assert.AreEqual("VerifyOrderDetails", result.RouteValues["action"]);
Assert.AreEqual(appraisalOrderId, result.RouteValues["id"]);
}
您还没有展示这些PersistErrors
方法是什么以及它的行为方式,因此很难说出测试它的正确方法。如果此方法正在使用它们,您可能需要模拟其他东西。鉴于您在其上方发表的评论,我想您以某种方式在ModelState
使用AddModelErrorMethod
. 如果是这种情况,您可以在测试的断言阶段对其进行验证:
Assert.IsFalse(sut.ModelState.IsValid);
如果您知道存储错误的密钥:
Assert.AreEqual(
"some expected message",
sut.ModelState["someKey"].Errors.Single().ErrorMessage
);