Kyl*_*fin 7 c# unit-testing mocking linq-to-sql
我有以下方法:
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();
}
Run Code Online (Sandbox Code Playgroud)
当mContext是System.Data.Linq.DataContext一切伟大工程.但是,如果mContext在我的联合测试期间是内存中的模拟,则之间的比较e.Password和hash始终返回false.
如果我重写这个比较e.Password.SequenceEqual(hash),那么我的单元测试将通过,但是当我与LinqToSql交谈时我得到一个例外.(System.NotSupportedException:不支持查询运算符'SequenceEqual'.)
有没有办法可以编写这个查询,以满足我的单元测试与内存模拟,以及与LinqToSql生产组件?
这是一个有趣的事情。我想不出一种在不破坏所有内容的情况下拦截等于的便捷方法,但是:用户名是否唯一?您可以只在 LINQ 中包含用户名条件,然后在常规 C# 中检查哈希值。就传输的数据而言,传入和取出数据之间几乎没有什么区别,特别是如果我们针对成功案例进行优化(在这种情况下,这会减少IO 需求)。
注意:如果这样做,“未找到”和“不匹配”将返回相同的结果。
因为 byte[] 比较不再依赖于 LINQ-to-SQL 的特殊处理,所以它现在应该可以在您的模拟中正常工作。
var user = (by name).SingleOrDefault();
if(user==null) #fail
bool hashMatch = /* compare array */
if (!hashMatch) #fail
return user;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1033 次 |
| 最近记录: |