2010-09-19 22 views
6

alay kullanan bir birim test Aşağıdaki yöntemi vardır:karşılaştırılması byte [] içinde LINQ-SQL-ve

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 bir System.Data.Linq.DataContext her şey iyi çalışıyor olduğunu. Ancak, birleştirme testim sırasında mContext bellek içi bir alay olduğunda, e.Password ve hash arasındaki karşılaştırma her zaman false değerini döndürür.

Bu karşılaştırmayı e.Password.SequenceEqual(hash) olarak yeniden yazarsam, birim testlerim geçecek, ancak LinqToSql ile konuşurken bir istisna yapıyorum. (System.NotSupportedException: 'SequenceEqual' sorgusu işleci desteklenmez.)

Bu soruyu, birim sınamalarımı bir bellek içi takma adla ve aynı zamanda LinqToSql?

cevap

3

Bu ilginç bir tanesi. Her şeyi bozmadan eşitleri yakalamanın uygun bir yolunu düşünemiyorum, ama: kullanıcı isimleri benzersiz mi? sadece LINQ adresindeki kullanıcı adı koşulunu ekleyebilir, sonra hash'i düzenli C# olarak kontrol edebilirsiniz. Aktarılan veriler açısından, özellikle başarı durumu için optimize edersek (bu durumda bu , IO gerekliliklerini azaltır), onu aktarma ve getirme arasında çok az fark vardır.

Not: Bunu yaptığınızda "bulunamadı" ve "eşleşme" için aynı sonucu döndürün.

Bayt [] karşılaştırması artık LINQ-to-SQL tarafından yapılan özel işlemlere bağlı olmadığından, artık sahte olarak iyi çalışmalıdır.

var user = (by name).SingleOrDefault(); 
if(user==null) #fail 
bool hashMatch = /* compare array */ 
if (!hashMatch) #fail 
return user; 
+0

+1 - Başlangıçta aynı şeyi yapıyordum ama sonra IO'nun * 1 * talebini azaltabileceğimi ve sadece şifreleri normal LINQ ile karşılaştırabileceğimi farkettim. – TheCloudlessSky

0

Bu, birim testi için iyi bir aday değil. SQL eşitliğini test ederek .Net'in eşitliğini kullanarak hangi değer üretilir?

psuedocode olarak, üç yöntem çağrısı (esas olarak) bakınız:

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

bu üç adı yöntemlerin her biri,

birimi test edilebilir. Orijinal metodu test eden birim nedir?

İlgili konular