gpt4 book ai didi

c# - 如何对该方法的 catch block 进行单元测试?

转载 作者:行者123 更新时间:2023-12-02 14:48:20 26 4
gpt4 key购买 nike

我正在学习单元测试。如何使用 NUnit 和 Rhino Mock 对该方法进行单元测试?好吧,我已经测试了 try block ,并想测试 catch block 的代码覆盖率。

[HttpPost]
public ActionResult AppraisalOrderIsAcceptedByEmployee(int appraisalOrderId)
{
try
{
this.appraisalOrderService.SubmitAppraisalOrder(appraisalOrderId);
}
catch (MessageLoneException ex)
{
// Display validation errors
PersistErrors(ex);

// Remains on the same view
return RedirectToAction("VerifyOrderDetails", new { id = appraisalOrderId });
}
return GetLoginRedirectCurrentUser();
}

最佳答案

假设 appraisalOrderService 是一个接口(interface)(在正确架构的应用程序中这是一个安全的假设),您的 Controller 将其用作构造函数注入(inject),您可以轻松地使用您最喜欢的模拟框架来模拟它。例如,使用 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 方法是什么以及它的行为方式,因此很难说出测试它的正确方法。如果此方法正在使用其他内容,您可能需要模拟它们。鉴于您在上面添加的评论,我认为您以某种方式使用 AddModelErrorMethod 将错误添加到 ModelState 中。如果是这种情况,您可以在测试的断言阶段验证它:

Assert.IsFalse(sut.ModelState.IsValid);

如果您知道存储错误的 key :

Assert.AreEqual(
"some expected message",
sut.ModelState["someKey"].Errors.Single().ErrorMessage
);

关于c# - 如何对该方法的 catch block 进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14380605/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com