如何对依赖关系进行单元测试?

时间:2014-04-15 13:33:05

标签: 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 && 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)));
    }

3 个答案:

答案 0 :(得分:0)

您的ProductService模拟设置在此处:

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

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

答案 1 :(得分:0)

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

这是我非常喜欢的单元测试。它巧妙地强制你重新设计并出于所有正确的理由。

答案 2 :(得分:0)

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

let json = JSON(jsonData)
print(json)
[
  {
    "Points" : 10,
    "Quantity" : 1,
    "RedeemedLocationID" : 6
  },
  {
    "Points" : 12,
    "Quantity" : 2,
    "RedeemedLocationID" : 6
  }
]
相关问题