【发布时间】:2014-10-13 17:15:56
【问题描述】:
我的 SQL 表中有一个二进制列,我使用以下 C# 代码成功查询了该表:
var hash = "http://www.whatever.com".ToSHA256HashBytes();
var landingPage = context.LandingPages.FirstOrDefault(lp => lp.UrlHash == hash);
- 请注意:“ToSHA256HashBytes”是我写的一个扩展方法,它返回一个字节[]
这很有效,因为 SQL 将比较 byte[] 的内容并返回匹配“UrlHash”的记录。
但是,这在我的单元测试中不起作用,因为比较是在内存中执行的,并且比较 byte[] 的规则显然不同。如果两个字节数组位于内存中的同一位置,而不是通过比较数组的内容,C# 似乎会认为它们是相等的。
这意味着后面的单元测试会失败
var data = new[]
{
new LandingPage() { UrlHash = "http://www.whatever.com".ToSHA256HashBytes() },
new LandingPage() { UrlHash = "http://mycompany.com/another/folder/page.php"".ToSHA256HashBytes() },
new LandingPage() { UrlHash = "http://someothercompany.com/folder/somepage.html"".ToSHA256HashBytes() }
};
var mockData = new Mock<DbSet<T>>();
var queryableData = data.AsQueryable();
mockData.As<IQueryable<T>>().Setup(m => m.Provider).Returns(queryableData.Provider);
mockData.As<IQueryable<T>>().Setup(m => m.Expression).Returns(queryableData.Expression);
mockData.As<IQueryable<T>>().Setup(m => m.ElementType).Returns(queryableData.ElementType);
mockData.As<IQueryable<T>>().Setup(m => m.GetEnumerator()).Returns(queryableData.GetEnumerator());
var mockContext = new Mock<MyContext>();
mockContext.Setup(m => m.LandingPages).Returns(mockData.Object);
var hash = "http://www.whatever.com".ToSHA256HashBytes();
var landingPage = mockContext.Object.LandingPages.FirstOrDefault(lp => lp.UrlHash == hash);
Assert.IsNotNull(landingPage);
有没有一种方法可以编写我的 Linq 查询,使其在单元测试和查询数据库时都能正常工作?
我找到了一个非常 similar question,但 OP 通过更改他的查询(不幸的是这对我来说不是一个选项)解决了他的问题,而不是真正找到他原来问题的解决方案。
【问题讨论】:
标签: c# unit-testing mocking