Сравнение byte [] в LINQ-to-SQL и в модульном тесте, который использует mocking - PullRequest
7 голосов
/ 19 сентября 2010

У меня есть следующий метод:

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. (System.NotSupportedException: оператор запроса 'SequenceEqual' не поддерживается.)

Есть ли способ, которым я могу написать этот запрос, который будет удовлетворять моим модульным тестам с макетом в памяти, а также производственным компонентом с LinqToSql?

Ответы [ 2 ]

3 голосов
/ 19 сентября 2010

Это интересный.Я не могу придумать удобный способ перехвата равных, не нарушая все, но: уникальны ли имена пользователей?Вы можете просто включить условие имени пользователя в LINQ, а затем проверить хэш в обычном c #.С точки зрения передаваемых данных существует небольшая разница между передачей и извлечением, особенно если мы оптимизируем для успешного случая (в этом случае снижает требования к IO).: если вы сделаете это, вы получите одинаковый результат для «not found» и «not match»сейчас в твоей насмешке.

var user = (by name).SingleOrDefault();
if(user==null) #fail
bool hashMatch = /* compare array */
if (!hashMatch) #fail
return user;
0 голосов
/ 19 сентября 2010

Это не хороший кандидат для юнит-тестирования. Какое значение получается путем проверки равенства SQL с использованием равенства .Net?

В psuedocode я вижу (по сути) три вызова метода:

HashPassword(); 
ConstructQuery();
FirstOrDefault();

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...