我有类似这样的方法:
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
答案 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如何编码只是它返回正确的值。