Сравнение 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();

каждый из этих трех методов могут быть протестированы. В чем смысл модульного тестирования оригинального метода?