我的SQL表中有一个二进制列,我使用以下C#代码成功查询了该表:
var hash = "http://www.whatever.com".ToSHA256HashBytes();
var landingPage = context.LandingPages.FirstOrDefault(lp => lp.UrlHash == hash);
>请注意:“ToSHA256HashBytes”是我写的一个扩展方法,它返回一个byte []
这很好用,因为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通过改变他的查询(很遗憾不是我的选项)解决了他的问题,而不是实际找到他原来的问题的解决方案.
最佳答案 您可以使用
Enumerable.SequenceEqual
扩展方法:
var landingPage = context.LandingPages
.FirstOrDefault(lp => lp.UrlHash.SequenceEqual(hash));
当且仅当两个源序列长度相等且其对应元素根据其类型的默认相等比较器相等时,SequenceEqual的返回值才为真.