我是第一次接触MS Unit Testing和Moq objects。我正在尝试测试我的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(percentage);中显示为null
发布于 2019-01-17 01:15:27
您必须设置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。(返回mock的mock是不可取的,但如果您刚开始,我会将该详细信息归档,然后再回来讨论。)
我猜percentage是个decimal。It.IsAny<decimal>()意味着模拟并不关心值是什么。这通常是可以的,因为您正在测试的是您的类对mock返回的对象执行的操作。
发布于 2019-01-17 01:13:14
对于要使用的方法,您需要在模拟对象上调用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 herehttps://stackoverflow.com/questions/54221985
复制相似问题