コントローラーがコンストラクター インジェクションとして受け取るインターフェイス (適切に設計されたアプリケーションでは安全な想定appraisalOrderService
です) であると仮定すると、お気に入りのモック フレームワークで簡単にモックできます。たとえば、Rhino モックを使用すると、テストは次のようになります。
[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
);