比较 LINQ-to-SQL 中的 byte[] 和使用模拟的单元测试

2024-04-04

我有以下方法:

User IDataContext.AuthenticateUser(string userName, string password)
{
   byte[] hash = PasswordHasher.HashPassword(userName, password);

   var query =
       from e in mContext.GetTable<User>()
       where e.Email == userName && e.Password == hash
       select e;

   return query.FirstOrDefault();
}

When mContext is a System.Data.Linq.DataContext一切都很好。然而,当mContext是我联合测试期间的内存模拟,之间的比较e.Password and hash总是返回false.

如果我将这个比较重写为e.Password.SequenceEqual(hash),那么我的单元测试就会通过,但是当我与 LinqToSql 交谈时出现异常。 (System.NotSupportedException:不支持查询运算符“SequenceEqual”。)

有没有一种方法可以编写这个查询,以满足我使用内存模拟的单元测试以及使用 LinqToSql 的生产组件?


这是一个有趣的事情。我想不出一种在不破坏所有内容的情况下拦截等于的便捷方法,但是:用户名是否唯一?你可以just在 LINQ 中包含用户名条件,然后在常规 C# 中检查哈希值。就传输的数据而言,传入和取出数据之间几乎没有什么区别,特别是如果我们针对成功案例进行优化(在这种情况下reducesIO 要求)。

注意:如果执行此操作,“未找到”和“不匹配”将返回相同的结果。

由于 byte[] 比较不再依赖于 LINQ-to-SQL 的特殊处理,因此它现在应该可以在您的模拟中正常工作。

var user = (by name).SingleOrDefault();
if(user==null) #fail
bool hashMatch = /* compare array */
if (!hashMatch) #fail
return user;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

比较 LINQ-to-SQL 中的 byte[] 和使用模拟的单元测试 的相关文章

随机推荐