Unit testing 对模拟对象的期望值不为';似乎未达到(最低起订量)

Unit testing 对模拟对象的期望值不为';似乎未达到(最低起订量),unit-testing,moq,expect,Unit Testing,Moq,Expect,我在Moq中遇到了一些奇怪的行为-尽管我设置了一个模拟对象以某种方式进行操作,然后在我正在测试的对象中以完全相同的方式调用该方法,但它的反应就像从未调用过该方法一样 我尝试测试以下控制器操作: public ActionResult Search(string query, bool includeAll) { if (query != null) { var keywords = query.Split(' '); return View(rep

我在Moq中遇到了一些奇怪的行为-尽管我设置了一个模拟对象以某种方式进行操作,然后在我正在测试的对象中以完全相同的方式调用该方法,但它的反应就像从未调用过该方法一样

我尝试测试以下控制器操作:

public ActionResult Search(string query, bool includeAll)
{
    if (query != null)
    {
        var keywords = query.Split(' ');
        return View(repo.SearchForContacts(keywords, includeAll));
    }
    else
    {
        return View();
    }
}
我的单元测试代码:

public void SearchTestMethod() // Arrange
    var teststring = "Anders Beata";
    var keywords = teststring.Split(' ');
    var includeAll = false;
    var expectedModel = dummyContacts.Where(c => c.Id == 1 || c.Id == 2);
    repository
        .Expect(r => r.SearchForContacts(keywords, includeAll))
        .Returns(expectedModel)
        .Verifiable();

    // Act
    var result = controller.Search(teststring, includeAll) as ViewResult;

    // Assert
    repository.Verify();
    Assert.IsNotNull(result);
    AssertThat.CollectionsAreEqual<Contact>(
        expectedModel, 
        result.ViewData.Model as IEnumerable<Contact>
    );
}
如果我删除
repository.Verify()
,集合断言将失败,告诉我返回的模型是
null
。我已经调试并检查了
query!=null,并且我被带到运行代码的
if
块的一部分。没问题


为什么这不起作用?

我怀疑这是因为传递到模拟存储库中的数组(teststring.Split(“”)
)的结果与实际从搜索方法传递的对象(query.Split(“”)的结果)不同

尝试将安装代码的第一行替换为:

repository.Expect(r => r.SearchForContacts(
    It.Is<String[]>(s => s.SequenceEqual(keywords)), includeAll))
repository.Expect(r=>r.SearchForContacts(
It.Is(s=>s.SequenceEqual(关键字)),includeal)

。。。它将把传递给mock的数组中的每个元素与
关键字
数组中的相应元素进行比较。

谢谢!这立刻就成功了!=)似乎我必须阅读Moq,特别是何时以及如何使用它。。。构造。
repository.Expect(r => r.SearchForContacts(
    It.Is<String[]>(s => s.SequenceEqual(keywords)), includeAll))