[英]How to unit test dependencies?
下面是方法代码:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Product_Update([DataSourceRequest] DataSourceRequest request, [Bind(Prefix = "models")]IEnumerable<ProductViewModel> products)
{
if (products != null && ModelState.IsValid)
{
foreach (var product in products)
{
ProductDto target = ProductService.GetProduct(product.productId);
DateTime now = DateTime.Now;
if (target != null)
{
CategoryDto dto = new CategoryDto
{
ChangeDate = now,
CreateDate = now,
FKChangedBy = 1,
FKCreatedBy = 1,
FKPhoneTypeID = 2, phone.SelectedTelephoneType),
};
ProductService.UpdateProduct(dto);
}
}
}
return Json(ModelState.ToDataSourceResult());
}
在上面的方法中,ProductService是该方法的依赖项。哪个在循环中触发。我在嘲笑我的两个依赖方法“ GetProduct”和“ UpdateProduct”。但是当我在嘲笑它(例如,GetProduct)时,该方法执行它总是返回null,这就是为什么其他部分:-
target != null
没有执行。有人可以建议我进行测试的方法吗? 还有我如何测试循环中调用的依赖项?
以下是单元测试方法:
[TestMethod]
public void Product_Update_PostTest_Test()
{
//Act
Kendo.Mvc.UI.DataSourceRequest request = new Kendo.Mvc.UI.DataSourceRequest();
var ID = 1;
//mock the dependencies
_productServiceMock.Setup(x => x.GetProduct(ID)).Returns(_productDto);
_productServiceMock.Setup(x => x.UpdateProduct(_categoryDto));
//Arrange
var actual = _productController.Product_Update(request, _productViewModelList) as JsonResult;
//Assert
Assert.IsNotNull(actual);
Assert.IsInstanceOfType(actual, typeof(JsonResult));
Assert.IsTrue(_productController.ModelState.IsValid);
Assert.AreEqual(null, ((Kendo.Mvc.UI.DataSourceResult)(actual.Data)));
}
您的ProductService
模拟在这里设置:
_productServiceMock.Setup(x => x.GetProduct(ID)).Returns(_productDto);
_productServiceMock.Setup(x => x.UpdateProduct(_categoryDto));
但是据我所知,您实际上并不是在告诉您的Controller类在测试中使用该模拟实例-您是否有未在此处显示的更多设置?
我相信您需要依赖将ProductService注入到Controller中。 尝试调试控制器,并检查ProductService是否是MOQ已创建的代理对象。 您可以使用任何DI框架,例如Spring.Net,MS Unity等。
这是我绝对喜欢单元测试的地方。 出于所有正确的原因,它巧妙地迫使您重新设计。
您可以使用此实例化您的产品服务:
var _productServiceMock = new Mock< IProductService >();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.