2015-11-15 14 views
16

मैं इसे अपने कन्स्ट्रक्टर को कॉल करके एक विश्वसनीय सेवा/अभिनेता का परीक्षण नहीं कर सकता और फिर इसकी विधियों का परीक्षण कर सकता हूं। var testService = new SomeService(); एक NullReferenceException फेंकता है। तो मैं तैनात सेवा के साथ क्या कर सकता हूं ..सेवा फैब्रिक यूनिट परीक्षण और निर्भरता इंजेक्शन

मैं समझता हूं कि तैनात एसएफ विश्वसनीय सेवाएं/अभिनेता मानक नहीं हैं .NET कक्षाएं, और तैनात एस/ए की यूनिट परीक्षण शायद एक अजीब विचार है।

वैसे भी मैं इसे आज़माने की कोशिश कर रहा हूं।

उदाहरण के लिए। मैंने परीक्षण की तुलना में केवल एक सेवा तैनात की है, मैंने प्रॉक्सी ऑब्जेक्ट बनाया है और सेवा की इनपुट कतार में जोड़ा गया आइटम है। तो मुझे उस इनपुट कतार गणना = 1. पर जोर देना होगा और यह काम करता है अगर मैंने अभी सेवा को तैनात किया है और कोई अन्य ग्राहक/सेवाएं/अभिनेता ने इसकी इनपुट कतार का उपयोग नहीं किया है। लेकिन अगली बार यह परीक्षण असफल हो जाएगा कि समस्या है। मुझे सेवा को अन्य उपभोक्ताओं के साथ संचालन रोकने, इसे कतार छोड़ने और परीक्षण करने की आवश्यकता है। इस उद्देश्य के लिए मैं कुछ टेस्टमोड प्रॉपर्टी और कुछ तरीकों जैसे प्रोपेरियोफोर्स्ट/टेस्टिंग को तैयार कर सकता हूं और परीक्षण से पहले और बाद में परीक्षण क्लाइंट से उन्हें कॉल कर सकता हूं।

क्या ऐसा करना एक बुरा विचार है। शायद यूनिट परीक्षण एसएफ के लिए कुछ दिशानिर्देश हैं? धन्यवाद।

अद्यतन:

Service Fabric Web Reference Application example की जांच करते समय मैं इस TODO स्ट्रिंग पाया है:

/// TODO: Temporary property-injection for an IServiceProxyWrapper until constructor injection is available. 

यह मतलब यह है कि एस एफ सेवाएं यह डि समर्थन में सुधार होगा? अभिनेताओं के बारे में क्या?

+3

कन्स्ट्रक्टर निर्भरता इंजेक्शन वास्तव में अभिनेताओं में उपलब्ध है! जब आप अपने अभिनेता के प्रकार को पंजीकृत करते हैं, तो आप एक "फैक्ट्री" भी पंजीकृत कर सकते हैं जो वास्तव में सिर्फ एक Func <> जहां आप अपना अभिनेता वर्ग उदाहरण बनाते हैं, जो आपको अपने अभिनेता के तत्काल पर नियंत्रण देता है ताकि आप वहां से निर्भरता इंजेक्ट कर सकें। सेवाओं में आप पहले से ही ऐसा कर सकते हैं, पार्टी क्लस्टर नमूना में हम इसे कैसे करते हैं: https://github.com/Azure-Samples/service-fabric-dotnet-management-party-cluster/tree/master/PartyCluster/ क्लस्टर सेवा –

+1

मैंने एकता के साथ निर्भरता इंजेक्शन करने पर एक उत्तर लिखा: http://stackoverflow.com/questions/30384780/azure-service-fabric-actor- निर्भरता- इंजेक्शन /35900027#35900027 –

+0

@VaclavTurecek आपका लिंक टूटा हुआ है – Dismissile

उत्तर

16

दरअसल आप विश्वसनीय सेवाओं और अभिनेताओं का परीक्षण कर सकते हैं वैसे ही आप .NET में किसी अन्य वर्ग का परीक्षण करेंगे! वे केवल विशेष हैं कि वे अंतर्निहित प्लेटफार्म में कुछ हुक का उपयोग करते हैं, लेकिन इसके अलावा आप अपनी सेवा या अभिनेता वर्ग को सामान्य रूप से तुरंत चालू कर सकते हैं और उस पर कॉल कर सकते हैं।

वर्तमान में, विश्वसनीय सेवाएं यूनिट परीक्षण के लिए थोड़ा आसान हैं क्योंकि मंच में प्राथमिक हुक, राज्य प्रबंधक, एक इंटरफ़ेस है जो कन्स्ट्रक्टर के माध्यम से प्लग करने योग्य है।

उदाहरण के लिए, आपकी सेवा वर्ग इस प्रकार दिखाई देंगे:

संपादित करें: GA रिहाई एपीआई के साथ अपडेट किया (2.0.135)

class MyService : StatefulService 
{ 
    public MyService (StatefulServiceContext context, IReliableStateManager stateManager) 
     :base (context, stateManager) 
    { 
    } 

    public void MyMethod() 
    { 
    // do stuff.. 
    } 
} 

तो फिर तुम तो जैसे आपकी सेवा वर्ग का परीक्षण कर सकते हैं:

[TestMethod] 
public TestMyMethod() 
{ 
    MockReliableStateManager stateManager = new MockReliableStateManager(); 
    MyService target = new MyService(stateManager); 

    target.MyMethod(); 
    // validate results and all that good stuff 
} 

हम GitHub पर उपलब्ध परीक्षण किया निर्भरता इकाई जा रहा है की बहुत सारी के साथ वास्तविक सेवाओं की पूरी काम कर उदाहरण है: https://github.com/Azure-Samples/service-fabric-dotnet-management-party-cluster

इस उदाहरण में IReliableStateManager और IReliableDictionary mocks हैं, साथ ही आप अपने स्वयं के यूनिट परीक्षणों के लिए प्रारंभिक बिंदु के रूप में उपयोग कर सकते हैं।

+0

धन्यवाद, वाक्लाव! यह वही है जो आवश्यक है। कृपया अद्यतन पर एक नज़र डालें। – AsValeO

+1

आरटीएम (अभिनेता 2.0.135) में, 'अभिनेता। स्टेटमैनगर' संपत्ति केवल पढ़ने योग्य है (कोई 'संरक्षित सेट' नहीं)। मुझे अपने अभिनेता वर्ग के लिए राज्य प्रबंधक निर्भरता कैसे इंजेक्ट करनी चाहिए? –

+0

और अभिनेताओं के लिए अनुस्मारक और टाइमर के बारे में क्या? मैं 'ReceiveReminderAsync' विधि को स्वयं कॉल कर सकता हूं, लेकिन मुझे' RegisterReminderAsync' ('ActorBase' पर संरक्षित विधि) में किए जा रहे कॉल को सत्यापित करने की आवश्यकता है। –

4

विश्वसनीय अभिनेता में राज्य प्रबंधक मजाक के लिए, आप कुछ इस तरह कर सकते हैं:

private readonly IActorStateManager _stateManager; 

public MyActor(IActorStateManager stateManager = null) 
{ 
    _stateManager = stateManager ?? this.StateManager; 
} 

वास्तव में, StateManager अभी तक इस समय प्रारंभ नहीं किया गया है। हम इसे प्राप्त कर सकते हैं जब OnActivateAsync कहा जाता है:

private IActorStateManager _stateManager; 

// Unit tests can inject mock here. 
public MyActor(IActorStateManager stateManager = null) 
{ 
    _stateManager = stateManager; 
} 

protected override async Task OnActivateAsync() 
{ 
    if (_stateManager == null) 
    { 
     _stateManager = StateManager; 
    } 
} 

बस हमेशा के बजाय this.StateManager कोड के बाकी हिस्सों में _stateManager का उपयोग सुनिश्चित करें।

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