5

के साथ एकीकरण परीक्षण मैं अपने आवेदन के लिए एकीकरण परीक्षण लिखता हूं, और इसके लिए मेरे कंटेनर का उपयोग करता हूं। मैं वास्तविक घटकों में सभी घटकों को पंजीकृत करने में सक्षम होना चाहता हूं, और फिर कुछ घटकों को ओवरराइड करता हूं और उन्हें स्टब्स कार्यान्वयन का उपयोग करने के लिए स्विच करता हूं।ऑटोफैक पंजीकरण ओवरराइड करें - डी

मैं DI को अलग नहीं करना चाहता और केवल परीक्षण के लिए एक कंटेनर रखना चाहता हूं क्योंकि मैं असली चीज़ का परीक्षण करना चाहता हूं।

ऐसा करने से भी बदसूरत लगता है:

public class MyRegistrations 
{ 
    public static RegisterAll(bool isInTest= false) 
    { 
      if (isTest) 
      { 
      // Register test fakes 
      } 
      else 
        // Register real components 
     } 
} 

तो मैं अपने परीक्षण वातावरण में पंजीकरण अधिभावी के बारे में सोचा। यह कैसे किया जाना चाहिए?

मेरे लक्ष्य को प्राप्त करने के लिए कोई और बेहतर तरीका?

धन्यवाद

+0

क्या मैं पूछ सकता हूं कि आप अपने एकीकरण परीक्षण के हिस्से के रूप में घटकों को नकल क्यों करना चाहते हैं? क्या आप अपने आवेदन की अंत-टू-एंड कार्यक्षमता की तलाश नहीं कर रहे हैं जिसे आप नकली घटक के साथ नहीं प्राप्त करेंगे? यहां तक ​​कि यदि इसका मतलब किसी वास्तविक डेटाबेस उदाहरण या डब्लूसीएफ एंड-पॉइंट इत्यादि को लिखना है। –

+1

@StephenRoss ऐसे मामले हैं जहां एकीकरण परीक्षण में एक विशिष्ट स्थिति को अनुकरण करना बहुत मुश्किल है, लेकिन आप इसे एकीकरण के हिस्से के रूप में जांचना चाहते हैं परीक्षा; उदाहरण के लिए सी और सी एजेंट जो अलर्ट करता है जब डिस्क सी और सी सर्वर पर पूर्ण होती है। –

+0

@ ओल्डफ़ॉक्स यदि वह मेरे एप्लिकेशन पर एक एकीकरण परीक्षण किया गया था, तो भी मैं डिस्क को अधिकतम लोड करना चाहता हूं। आप (इकाई) पहले से ही एक यूनिट परीक्षण में परीक्षण कर रहे हैं कि बातचीत सही तरीके से संभाली जाती है, लेकिन अब आप यह सुनिश्चित करने के लिए जांच कर रहे हैं कि सबकुछ सही-से-अंत में सही ढंग से काम करता है (सही ढंग से एकीकृत)। यदि इसका मतलब है कि परीक्षण के लिए डिस्क पर 10 जीबी रिक्त डेटा लिखना है तो यह हो, अन्यथा हम कैसे और जानेंगे कि हम (मुझे उम्मीद है) घटना को सही तरीके से और सही समय पर संभालने वाले हैं। –

उत्तर

2

Autofac पिछले उपयोग करेगा उस सेवा के डिफ़ॉल्ट प्रदाता के रूप में पंजीकृत घटक

From the AutoFac documation.

अपने व्यवस्था/सेटअप/testInit चरण में mocks रजिस्टर, तो SUT हल:

[SetUp] 
public void TestInit() 
{ 
    Mock<IFoo> mock = new Mock<IFoo>(); 
    builder.RegisterInstance(mock.object).As<IFoo>(); 
    ... 
    ... 
    _target = builder.Resolve<The component>(); 
} 

नोट:

Singletons, स्थिर सदस्यों और SingletonLifestyle (पंजीकरण) कुछ परेशानियों का कारण बन सकता है। ...

+0

साझा करते हैं तो मैं बहुत खुश रहूंगा, धन्यवाद, यह जीवन आसान होगा, लेकिन यह कहकर आप क्या कहेंगे कि सिंगलेट्स समस्याग्रस्त हो जाएंगे? मेरे लगभग सभी एप्लिकेशन के घटक सिंगलेट हैं –

+0

@ एस पीटर मैं प्रश्न में आपकी टिप्पणी पढ़ता हूं, शायद आपको मेरी समस्याओं का सामना नहीं करना पड़ेगा; आपके कुछ सिंगलेट्स ऑब्जेक्ट्स के कुछ संदर्भ रख सकते हैं जिन्हें आप परिदृश्य एक्स में नकल करना चाहते हैं लेकिन वाई में नहीं। ये समस्याएं आमतौर पर वेब सेवाओं में मौजूद होती हैं ... –

1

ठीक है, उदाहरण के लिए आप एक स्थिर कार्रवाई विधि अपनी संरचना जड़ के भीतर वर्तमान विन्यास में परिवर्तन और परीक्षण के दौरान यह कॉल करने के लिए बना सकते हैं। उदाहरण के लिए:

public class CompositionRoot 
{ 
    public static Action<IContainer> OverrideContainer = c => { }; 

    internal static IContainer CreateContainer() 
    { 
     ContainerBuilder builder = new ContainerBuilder(); 

     /// etc. etc. 

     var container = builder.Build(); 

     OverrideContainer(container); 

     return container; 
    } 
} 

उसके बाद आप इस तरह उदाहरण के लिए, यदि आप सर्वर की एक नकली बना सकते हैं,:

[TestFixture] 
public class ConfigurationControllerFixture : BaseServer 
{ 
    [Test] 
    public async Task verify_should_get_data() 
    { 
     var response = await GetAsync(Uri); 
     Assert.AreEqual(HttpStatusCode.OK, response.StatusCode); 
    } 

    protected override string Uri 
    { 
     get { return "api/configuration"; } 
    } 
} 

public abstract class BaseServer 
{ 
    protected TestServer Server; 
    protected abstract string Uri { get; } 

    protected virtual void OverrideConfiguration() 
    { 
     CompositionRoot.OverrideContainer = c => 
     { 
      // new autofac configuration 
      cb.Update(c); 
     }; 

     AppStartup.OverrideConfiguration = c => 
     { 
      // same as explained, but for HttpConfiguration 
     }; 
    } 
} 

[SetUp] 
public void Setup() 
{ 
    OverrideConfiguration(); 

    Server = Microsoft.Owin.Testing.TestServer.Create(app => 
    { 
     var startup = new AppStartup(); 
      startup.Configuration(app); 
    }); 

    PostSetup(Server); 
} 

आशा है कि यह मदद करता है :)

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