2010-09-19 8 views
6

मजाक में मैं निम्न विधि है:तुलना बाइट [] में LINQ करने वाली एसक्यूएल और एक इकाई परीक्षण का उपयोग करता है कि

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?

उत्तर

3

यह एक दिलचस्प है। मैं सब कुछ तोड़ने के बिना बराबर को रोकने का एक सुविधाजनक तरीका नहीं सोच सकता, लेकिन: उपयोगकर्ता नाम अद्वितीय हैं? आप देख सकते हैं LINQ में उपयोगकर्ता नाम शर्त शामिल करें, फिर नियमित सी # में हैश देखें। हस्तांतरित डेटा के मामले में इसे पारित करने और इसे बाहर लाने के बीच थोड़ा अंतर होता है, खासकर यदि हम सफलता के मामले के लिए अनुकूलित करते हैं (इस मामले में यह आईओ आवश्यकताएं को कम करता है)।

नोट: यदि आप ऐसा करते हैं तो "नहीं मिला" और "एक मैच नहीं" के लिए एक ही परिणाम लौटाएं।

क्योंकि बाइट [] तुलना अब LINQ-to-SQL द्वारा विशेष उपचार पर निर्भर करती है, इसे अब आपके मॉक में ठीक काम करना चाहिए।

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

+1 - मैं शुरुआत में उसी तरह की चीज कर रहा था लेकिन तब मुझे एहसास हुआ कि मैं आईओ को * 1 * अनुरोध को कम कर सकता हूं और नियमित LINQ के साथ पासवर्ड की तुलना कर सकता हूं। – TheCloudlessSky

0

यह इकाई परीक्षण के लिए एक अच्छा उम्मीदवार नहीं है। .NET की समानता का उपयोग कर एसक्यूएल की समानता का परीक्षण करके क्या मूल्य बनाया जाता है?

psuedocode में, मैं (संक्षेप में) को देखने के तीन प्रणाली को बुलाती है:

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

इन तीन बुलाया तरीकों में से प्रत्येक इकाई का परीक्षण किया जा सकता है। इकाई विधि का परीक्षण करने का क्या मतलब है?

संबंधित मुद्दे