【问题标题】:How to unit test dependencies?如何对依赖项进行单元测试?
【发布时间】:2014-05-29 21:35:00
【问题描述】:

下面是方法代码:-

    [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?

标签: c# asp.net-mvc unit-testing moq


【解决方案1】:

您的 ProductService 模拟设置在这里:

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

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

【讨论】:

  • ,实际上我没有得到正确的方法来模拟调用 withing 循环的依赖项。你能建议我最好的方法吗?
  • 我想这就是你的答案。您有使用ProductService (ProductDto target = ProductService.GetProduct(product.productId);) 的代码,并且您有在模拟ProductService 上设置期望的代码 - 但是您的控制器实例是否在您的测试中使用您的模拟实例?
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    var _productServiceMock = new Mock< IProductService >();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 2017-09-03
      • 1970-01-01
      • 1970-01-01
      • 2010-10-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多