Результат модульного теста в нулевом объекте при тестировании веб-API 2 - PullRequest
0 голосов
/ 16 января 2019

Я новичок в MS Unit Testing и Moq объектах. Я пытаюсь проверить мой контроллер Web API 2. Я дал ниже мой модульный тест и код контроллера. При пошаговом выполнении кода он даже не переходит к методу GetDeliveryCodeStrategy.

[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 (в процентах);

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Вы должны настроить Mock для возврата определенного значения:

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. (Насмешки, которые возвращают насмешки, нежелательны, но если вы начинаете, я бы оставил эту деталь и вернулся к ней.)

Я предполагаю, что percentage это decimal. It.IsAny<decimal>() означает, что макет не имеет значения, какое значение. Обычно это нормально, потому что вы тестируете то, что ваш класс делает с объектом, возвращаемым макетом.

0 голосов
/ 16 января 2019

Вам нужно вызвать Setup() для фиктивных объектов для методов, которые вы хотите использовать:

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
...