2011-03-17 11 views
5

यह ऐसा कुछ करने का मेरा पहला प्रयास है, इसलिए उम्मीद है कि यह आसान है।यूनिटफवर्क पैटर्न का उपयोग कर राइनो मॉक एंटिटी फ्रेमवर्क

मैंने एक डब्ल्यूसीएफ सेवा बनाई है जो डेटाबेस तक पहुंचने के लिए इकाई फ्रेमवर्क का उपयोग करती है। मैंने यूनिटऑफवर्क इंटरफ़ेस लागू किया है, इसलिए मेरी सेवा अभी भी परीक्षण योग्य होने पर ईएफ का उपयोग कर सकती है। मैं का एक SQLUnitOfWork (एफई का प्रयोग करके) या एक InMemoryUnitOfWork के साथ या तो ठोस कार्यान्वयन (के साथ इस सेवा का उपयोग करते हैं

public interface IUnitOfWork 
{ 
    IObjectSet<tblClient> Clients { get; } 
    IObjectSet<tblServer> Servers { get; } 
    IObjectSet<tblSite> Sites { get; } 
    IObjectSet<tblServerLog> ServerLogs { get; } 
    void Commit(); 
} 

:

public class ProjectService : IProjectService 
{ 
    private IUnitOfWork db = null; 

    public ProjectService(IUnitOfWork unitofwork) 
    { 
     db = unitofwork; 
    } 

    public int RegisterSite(int CPUID) 
    { 
     if (db.Servers.Count(x => x.CPUID == CPUID) > 0) 
     { 
      // do something 
     } 

     return 0; 
    } 
} 

यहाँ मेरी UnitOfWork इंटरफेस है:

यहाँ मेरी सेवा है बस स्मृति वस्तुओं में) तो यह ठीक काम करता है।

मेमोरी ऑब्जेक्ट्स में ठीक से परीक्षण करने के बाद मैंने इस परीक्षण की कोशिश की।

[Test] 
public void RegisterAnExistingServer() 
    { 
     MockRepository mocks = new MockRepository(); 

     IUnitOfWork MockUnitOfWork = mocks.DynamicMock<IUnitOfWork>(); 

     ProjectService service = new ProjectService(MockUnitOfWork); 


     Expect.Call(MockUnitOfWork.Servers.Count(x => x.CPUID == 1234)).Return(0); 

     mocks.ReplayAll(); 

     int NewSiteID = service.RegisterSite(1234); 

     mocks.VerifyAll(); 
    } 

लेकिन जब मैं इसे का उपयोग राइनो नकली में एक उम्मीद के साथ Servers.Count पर मैं निम्न त्रुटि हो प्रयास करें:

System.ArgumentNullException : Value cannot be null. 
Parameter name: arguments 
at System.Linq.Expressions.Expression.RequiresCanRead(Expression expression, String paramName) 
at System.Linq.Expressions.Expression.ValidateOneArgument(MethodBase method, ExpressionType nodeKind, Expression arg, ParameterInfo pi) 
at System.Linq.Expressions.Expression.ValidateArgumentTypes(MethodBase method, ExpressionType nodeKind, ref ReadOnlyCollection`1 arguments) 
at System.Linq.Expressions.Expression.Call(Expression instance, MethodInfo method, IEnumerable`1 arguments) 
at System.Linq.Queryable.Count(IQueryable`1 source, Expression`1 predicate) 

क्या मैं गलत कर रहा हूँ ??

+2

शायद त्रुटि यह है कि 'सर्वर' शून्य है। मुझे लगता है कि आपको इसे भी सेट करना होगा। 'और अब भी वही त्रुटि; –

+0

तो मैं इस लाइन ' MockUnitOfWork.Servers = mocks.StrictMock >() जोड़ा गया। क्या आपका आशय यही था? –

+0

एक सुझाव, मैं रिकॉर्ड और प्लेबैक सिंटैक्स का उपयोग नहीं करता क्योंकि इसे पसंदीदा व्यवस्था-एक्ट-एस्टर शैली से आगे बढ़ाया गया है। राइनोमोक्स के साथ एपीआई को उसी नामस्थान में होने के कारण उन्हें अलग करना मुश्किल हो सकता है (पिछली बार मैंने चेक किया था)। – aqwert

उत्तर

4

माइकएस्ट सही है। राइनो.मैक्स रिकर्सिव मॉकिंग नहीं करता है। आपको कुछ वापस करने के लिए सर्वर प्रॉपर्टी का नकल करने की आवश्यकता है (बस एक खाली IObjectSet <tblServer> बनाएं और उसे वापसी मान के रूप में सेट करें)।

इसके अलावा, आप लैम्बडास पर अपेक्षाएं निर्धारित नहीं करना चाहते हैं। एक बार सब कुछ संकलित हो जाने के बाद, आपके कोड में लैम्ब्डा और आपके यूनिट टेस्ट में लैम्ब्डा दो पूरी तरह से अलग तरीके हैं (और आपकी अपेक्षा हमेशा असफल हो जाएगी)। अधिक जानकारी के लिए http://groups.google.com/group/rhinomocks/msg/318a35ae7536d90a देखें।

-6

शायद कुछ प्रतिबिंब आंतरिक रूप से चल रहा है और इसलिए आपको काम की अपनी इकाई को सीधे आगे नहीं मिल रहा है।

मैं दृढ़ता से निबर्ननेट पर स्विच करने का सुझाव देता हूं। इसके अलावा, डब्ल्यूसीएफ डुबकी।

+0

क्या आप विस्तृत कर सकते हैं? इसके अलावा डब्ल्यूसीएफ और ईएफ वे ढांचे हैं जिनका हम उपयोग कर रहे हैं केवल स्विच नहीं कर सकते हैं। –

+3

सिर्फ इसलिए कि आप जानते हैं कि इस सवाल का जवाब मतलब है कि व्यवस्थाएं वह उपयोग कर रहा है बुरा कर रहे हैं doenst न और वह स्विच करना चाहिए! इस प्रतिष्ठा को इस तरह के उत्तर के साथ कैसे रखा जा सकता है? –

+0

मेरे पास यह प्रतिष्ठा है क्योंकि लोग मेरे उत्तरों के लिए वोट देते हैं। एफई के साथ nhibernate (1 और 2 स्तर कैश, विस्तार अंक, विभिन्न डेटाबेस, आदि) की तुलना करें और आप देखेंगे। तब ServiceStack की तरह कुछ (कोड सेटअप, आसान आगे रखरखाव में) पर एक नज़र डालें और WCF के साथ उसकी तुलना। सवाल यह था कि "मैं क्या गलत कर रहा हूं"। तो सुझाव है कि एनएच और एसएस लागू हैं। –

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

  • कोई संबंधित समस्या नहीं^_^