C# 如何对依赖项进行单元测试?

C# 如何对依赖项进行单元测试?,c#,asp.net-mvc,unit-testing,moq,C#,Asp.net Mvc,Unit Testing,Moq,以下是方法代码:- [AcceptVerbs(HttpVerbs.Post)] public ActionResult Product_Update([DataSourceRequest] DataSourceRequest request, [Bind(Prefix = "models")]IEnumerable<ProductViewModel> products) { if (products != null && Mod

以下是方法代码:-

    [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());

    }
没有执行。有人能建议我测试它的方法吗?还有,如何测试在循环中调用的依赖项

以下是单元测试方法:-

    [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
mock在此处设置:

_productServiceMock.Setup(x => x.GetProduct(ID)).Returns(_productDto);
_productServiceMock.Setup(x => x.UpdateProduct(_categoryDto));

但就我所见,您并没有实际告诉您的控制器类在测试中使用该模拟实例-您是否有更多此处未显示的设置?

我认为您需要将ProductService依赖注入到控制器中。尝试调试控制器并检查ProductService是否是MOQ创建的代理对象。您可以使用任何DI框架,如Spring.Net、MS Unity等


这就是我绝对喜欢单元测试的地方。它巧妙地强制您重新设计,并且出于所有正确的原因。

您可以使用它来实例化您的产品服务:

var _productServiceMock = new Mock< IProductService >();
var_productServiceMock=newmock();

,事实上,我没有得到正确的方法来模拟依赖项,该依赖项正在调用withing循环。你能给我建议最好的方法吗?我想这就是你的答案。您的代码使用了
ProductService
ProductDto-target=ProductService.GetProduct(product.productId);
),您的代码设置了对模拟
ProductService
的期望-但是您的控制器实例是否在测试中使用了您的模拟实例?您如何在控制器中实例化ProductService?
var _productServiceMock = new Mock< IProductService >();