模拟匿名参数

时间:2014-08-07 12:08:18

标签: c# moq ninject-mockingkernel

我正在尝试模拟我的存储库层,并且我有一个方法GetSelection(Expression<Func<T, Boolean>> where)。我正在使用 Ninjects MickingKernel Moq 来实现这一目标。

当我执行以下操作时,它很好:

// Create instance of repository
var kernel = new MoqMockingKernel();
var templateRepoMock = kernel.GetMock<ITemplateRepo>();

// Setup mock
templateRepoMock.Setup(x=>x.GetSelection(y=>y.FieldName)
                .Returns(new List<Template>() {new Template { ... })); 
                // Lets pretend that FieldName is a bool!

// Call Service layer
var result = templateService.MyMethod();

// -> Service Layer method
public List<Template> MyMethod() 
{
    return _templateRepo.GetSelection(x=>x.FieldName);
}

但是当我尝试在表达式中添加一个附加参数时,我得到一个ArgumentNullExeption

// Setup mock 
templateRepoMock.Setup(x=>x.GetSelection(y=>y.SomeOtherField.Id == 1 
                                         && y.FieldName)
                .Returns(new List<Template>() {new Template { ... }));

当我将服务更新为以下内容时:

public List<Template> MyMethod(SomeObject myObject) 
{
    return _templateRepo.GetSelection(x=>x.SomeObject.Id == myObject.Id 
                                      && x.FieldName).ToList(); 
}

如果我将myObject.Id更新为1,似乎没问题。

为什么会发生这种情况的任何想法?

1 个答案:

答案 0 :(得分:1)

仍然看不到你做的异常,即使在使用你的Github项目时也是如此。相反,测试在VerifyAll行失败并显示以下消息:

  

Moq.MockVerificationException:以下设置未匹配:

     

IProductRepository mock =&gt; mock.GetProducts(x =&gt; x.Name ==“Test”&amp;&amp; x.IsActive)

但是,我认为你可能正在追逐一只红鲱鱼,因为Moq不支持设置采用Expression的方法。请参阅this answer