如何使用moq

时间:2015-08-05 11:13:42

标签: unit-testing asp.net-mvc-4 moq

我的控制器中有一个动作方法,如下所示

public ActionResult Index()
{
     var supplier = GetSupplierForUser();
     var model = SupplierService.GetOutstandingItems(supplier);          
     return View(model);
}

我已将供应商服务方法设置为

var supplierService = new Mock<ISupplierService>();
var supplier = new Supplier { Name = "Some Name",Id = 100};

supplierService.Setup(s => s.GetOutstandingItems(supplier))
                            .Returns(outstandingSupplierItemInfo.Object);

我不知道如何设置基本控制器中存在的方法Supplier GetSupplierForUser()以返回Supplier对象。从上面的moq设置,空供应商始终传递到SupplierService.GetOutstandingItems(supplier)

有什么想法吗?感谢

1 个答案:

答案 0 :(得分:2)

也许你需要:

supplierService.Setup(s => s.GetOutstandingItems(It.IsAny<Supplier>()))
    .Returns(outstandingSupplierItemInfo.Object);

It.IsAny<>内容将使Setup匹配任何传入对象(参数)。

由于您使用松散的模拟,如果没有Setup匹配相关的争论,Moq将返回null。请考虑使用MockBehavior.Strict代替例外。

如果您不使用It.IsAny<>,Moq必须尝试查看传递给Moq的供应商&#34;是否等于&#34;您创建supplier时使用的Setup。您的类型.Equals(...)classstruct具有Supplier语义,这一点很重要。

如果您没有相关的Equals语义,但仍希望将Setup限制为特定情况,请尝试以下方法:

supplierService
    .Setup(s => s.GetOutstandingItems(It.Is((Supplier s) => s.Name == "Some Name" && s.Id == 100)))
    .Returns(outstandingSupplierItemInfo.Object);