首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在测试web api时,单元测试结果为空对象2

在测试web api时,单元测试结果为空对象2
EN

Stack Overflow用户
提问于 2019-01-17 01:05:59
回答 2查看 197关注 0票数 0

我是第一次接触MS Unit Testing和Moq objects。我正在尝试测试我的Web API 2控制器。我在下面给出了我的单元测试和控制器代码。在单步执行代码时,它甚至没有转到GetDeliveryCodeStrategy方法。

代码语言:javascript
复制
[TestMethod]
public void  CreateDelivery_ShouldReturnDeliveryCode()
{
    Mock<IDeliveryStrategy> deliveryStrategy = new Mock<IDeliveryStrategy> 
 ();
    Mock<IDeliveryCode> deliveryCode = new Mock<IDeliveryCode>();
    var controller = new DeliveryCodeController(deliveryStrategy.Object, 
    deliveryCode.Object);
    var controllerContext = new HttpControllerContext();
    var request = new HttpRequestMessage();
    request.Headers.Add("appToken", "a57ffa87-950e-40f4-b965-17788becac7d");

    controllerContext.Request = request;
    controller.ControllerContext = controllerContext;

    var result = controller.CreateDelivery(50) as 
    CreatedNegotiatedContentResult<IDeliveryCode>;
    Assert.IsNotNull(result);

}

public class DeliveryCodeController : ApiController
{
    IDeliveryStrategy _deliveryBatch;
    IDeliveryCode _deliveryCode;

    //Constructor dependency injection through Autofac
   public DeliveryCodeController(IDeliveryStrategy DeliveryBatch, 
   IDeliveryCode deliveryCode)
   {
        _deliveryBatch = DeliveryBatch;
        _deliveryCode = deliveryCode;
   }

   [HttpPost]
   [Route("api/DeliveryCode/{percentage}")]
   public IHttpActionResult CreateDelivery(int percentage)
   {
      String appToken = String.Empty;

    if (Request.Headers.TryGetValues("appToken", out IEnumerable<String> 
    headerValues))
    {
    appToken = headerValues.FirstOrDefault();
    }
    if (!String.IsNullOrEmpty(appToken)))
    {   
    IDeliveryContext deliveryContext = 
       _deliveryBatch.GetDeliveryCodeStrategy(percentage);  
    _deliveryCode.Code = deliveryContext.Create();
    return Created(Request.RequestUri.ToString(), _deliveryCode);    
    }
    else
    {
    return Content(HttpStatusCode.Forbidden, new Error { message = "The App 
    Token is not valid." });
    }
  }

}

当我执行“调试测试”并逐步执行代码时,deliveryContext对象在代码IDeliveryContext deliveryContext = _deliveryBatch.GetDeliveryCodeStrategy(percentage);中显示为null

EN

回答 2

Stack Overflow用户

发布于 2019-01-17 01:15:27

您必须设置Mock以返回某个特定值:

代码语言:javascript
复制
IDeliveryContext deliveryContext = // ???? - whatever you want it to be. 
                                   // Could be another Mock.
                                   // This is what the Mock will return.

Mock<IDeliveryStrategy> deliveryStrategy = new Mock<IDeliveryStrategy>();
deliveryStrategy.Setup(x => x.GetDeliveryCodeStrategy(It.IsAny<decimal>()))
    .Returns(deliveryContext);

这告诉Mock,当调用它的GetDeliveryCodeStrategy方法时,它应该返回指定的IDeliveryContext。根据您正在尝试做的事情,这可能是另一个Mock。(返回mock的mock是不可取的,但如果您刚开始,我会将该详细信息归档,然后再回来讨论。)

我猜percentage是个decimalIt.IsAny<decimal>()意味着模拟并不关心值是什么。这通常是可以的,因为您正在测试的是您的类对mock返回的对象执行的操作。

票数 1
EN

Stack Overflow用户

发布于 2019-01-17 01:13:14

对于要使用的方法,您需要在模拟对象上调用Setup()

代码语言:javascript
复制
var deliveryStrategy = new Mock<IDeliveryStrategy>();
deliveryStrategy.Setup(x => x.GetDeliveryCodeStrategy(It.IsAny<int>))
    .Returns(AMockOfDeliveryContext); //you need to mock it beforehand so you can 
                                      //use the object here
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54221985

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档