簡體   English   中英

如何對依賴項進行單元測試?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM