出于某种原因,我在C#
中对以下内容进行单元测试时遇到了麻烦[Route("api/Orders/{orderID:int}/Items")]
public OrderItemsDTO Get(int orderID)
{
if (_orderItemsService.Get(orderID).Items.Count() == 0)
{
throw new HttpResponseException(
Request.CreateErrorResponse(HttpStatusCode.NotFound, String.Format("Order {0} not found.", orderID)));
}
return _orderItemsService.Get(orderID);
}
我正在为Async Add运行正确的单元测试,这是我正在使用的帖子,我试图通过一些调整来进行我的单元测试,我认为它会起作用,但事实并非如此。以下是我认为应该起作用的:
private OrderItemsController _testSubject;
private Mock<IOrderItemsService> _moqOrderItemsService = new Mock<IOrderItemsService>();
[TestInitialize]
public void TestInitialize()
{
_testSubject = new OrderItemsController(_moqOrderItemsService.Object);
}
[TestMethod]
[ExpectedException(typeof(HttpResponseException))]
public async Task ThrowHttpResponseExceptionWhenThereIsAValidationException()
{
_moqOrderItemsService.Setup(ois => ois.Get(It.IsAny<int>()))
.Throws(new ValidationException("test"));
try
{
_testSubject.Get(17);
}
catch(HttpResponseException ex)
{
Assert.IsNotNull(ex.Response);
Assert.AreEqual(HttpStatusCode.NotFound, ex.Response.StatusCode);
throw;
}
}
答案 0 :(得分:1)
您设置订单商品服务模拟,以便在使用任何ID调用时抛出ValidationException
。然后你期望控制器抛出HttpResponseException
这不是真的 - 你将从服务中抛出相同的异常。
你应该设置服务来返回一些对象(你没有提供服务接口的定义和它返回的类型)和空Items属性:
_moqOrderItemsService.Setup(ois => ois.Get(It.IsAny<int>()))
.Returns(/* some object with empty Items property */);
现在在控制器中,你将投掷HttpResponseException
路径。
旁注:为什么要抛出异常而不是返回Content(HttpStatusCode.NotFound, "Message")
之类的内容?您甚至可以使用方法IHttpActionResult NotFound(string message)
创建基本控制器,它将为您执行此操作。
答案 1 :(得分:0)
我建议不测试Web API控制器,而是测试_orderItemsService并模拟您在服务中使用的任何存储库。您可以断言OrderItemsDTO不为null。
根据Microsoft测试控制器,最佳做法是:https://docs.microsoft.com/en-us/aspnet/web-api/overview/testing-and-debugging/unit-testing-controllers-in-web-api。