通过GET对NotFound进行C#单元测试

时间:2017-03-23 20:47:49

标签: c# rest unit-testing

出于某种原因,我在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;
        }            
    }

2 个答案:

答案 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