Сравнение byte[] в 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();
}
, когда mContext
это System.Data.Linq.DataContext
все работает отлично. Однако, когда mContext
- это макет в памяти во время моего объединяющего тестирования, сравнение между e.Password
и hash
всегда возвращает false
.
если я перепишу это сравнение как e.Password.SequenceEqual(hash)
, тогда мои модульные тесты пройдут, но я получаю исключение, когда говорю с LinqToSql. (Система.NotSupportedException: оператор запроса "SequenceEqual" не является поддерживаемый.)
есть ли способ написать этот запрос, который удовлетворит мои модульные тесты с макетом в памяти, а также производственный компонент с LinqToSql?
2 ответов
Это интересно. Я не могу придумать удобный способ перехвата равных, не нарушая все, но: являются ли имена пользователей уникальными? Ты мог бы!--2-->просто включите условие имени пользователя в LINQ, затем проверьте хэш в обычном c#. С точки зрения передаваемых данных нет большой разницы между передачей и извлечением, особенно если мы оптимизируем для случая успеха (в этом случае это уменьшается IO требования.)
Примечание: верните тот же результат для "не найден" и "не совпадает", если вы это сделаете.
поскольку байт [] compare больше не зависит от специального обращения LINQ-to-SQL, он должен отлично работать в вашем макете.
var user = (by name).SingleOrDefault();
if(user==null) #fail
bool hashMatch = /* compare array */
if (!hashMatch) #fail
return user;
Это не хороший кандидат для модульного тестирования. Какое значение получается при тестировании равенства SQL с помощью равенства .Net?
в psuedocode я вижу (по существу) три вызова метода:
HashPassword();
ConstructQuery();
FirstOrDefault();
каждый из этих трех методов могут быть протестированы. В чем смысл модульного тестирования оригинального метода?