验证是否使用moq调用linq扩展方法

时间:2014-12-08 21:13:29

标签: c# linq unit-testing moq

我有类似这样的方法:

    public IEnumerable<string> GetCompaniesCities()
    {
        return CompanyRepository.All()
                      .OrderBy(c => c.City)
                      .Select(c => c.City.ToUpper())
                      .Distinct().ToList();
    }

如何测试(使用moq)调用OrderBy (c => c.City)?并Select(c => c.City.ToUpper()Distinct()

我正在

  

非虚拟(VB中可覆盖)成员的验证无效:x =&gt;   x.All()。OrderBy(c =&gt; c.City)

注意:它是一个单元测试,而不是集成测试,所以我没有去过db

3 个答案:

答案 0 :(得分:3)

您不会测试是否正在调用OrderBy,只是测试返回的字符串是否排序更容易。即,使用NUnit:

Assert.That(sut.GetCompaniesCities(), Is.Ordered);

同样使用Moq can't test that an extension method like OrderBy is called,这是不可能的。


为了解决您无法访问数据库的评论,您是正确的,模拟您的依赖项无需转到数据库。但是你可以模拟他们的返回值,这样你就可以模拟他们做了命中数据库。所以在这里,你的存储库是一个依赖项,你要模拟All()来返回一个未排序的值列表:

var companiesUnsorted = new Company[] { 
    new Company { City = "Xyz" },
    new Company { City = "Abc" }
};
var mockRepository = new Mock<ICompanyRepository>();
mockRepository.Setup(p => p.All()).Returns(companiesUnsorted);

var sut = new WhateverClassYourCodeSampleIsFrom(mockRepository.Object);

然后你只需执行上面的断言。

答案 1 :(得分:0)

您不能仅仅因为moq无法mock扩展方法而这样做。这是因为moq正在使用继承,扩展方法没有

答案 2 :(得分:0)

您要做的是Moq the CompanyRepository对象单元测试中的所有方法。将CompanyRepository Moq注入包含GetCompaniesCities()方法的类。

然后适当地填充Moq并让Unit Test验证GetCompaniesCities()方法返回预期结果。您并不关心GetCompaniesCities如何编码只是它返回正确的值。