[英]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.