5

पर NullReferenceException का कारण बनता है मैं SpecFlow 1.9 में अपना कोडेडयूआई परीक्षण जेनरेटर प्लगइन जोड़ने की कोशिश कर रहा हूं। मैं नए प्लगइन पंजीकरण का उपयोग करने की कोशिश कर रहा हूं, क्योंकि पुराने प्रकार के पंजीकरण हमारे समाधान में सभी प्रकार के मुद्दों का कारण बनते हैं, क्योंकि हम स्पेक्ट्रो जेनरेटर प्रदाता को स्पेकफ्लो इंस्टॉलेशन निर्देशिका में नहीं रखना पसंद करते हैं (जो कि प्रत्येक डेवलपर मशीन पर अलग है) ।कस्टम SpecFlow TestGeneratorProvider पंजीकरण परीक्षण पीढ़ी

मैंने नया Specflow.CustomPlugin NuGet package को .NET 4.0 क्लास लाइब्रेरी में जोड़ने के साथ शुरुआत की।

CodedUI जेनरेटर के लिए नमूने के आधार पर, मैं इस में इकट्ठा:

using TechTalk.SpecFlow.Infrastructure; 
[assembly: GeneratorPlugin(typeof(CodedUIGeneratorProvider.Generator.SpecFlowPlugin.CodedUIGeneratorPlugin))] 

namespace CodedUIGeneratorProvider.Generator.SpecFlowPlugin 
{ 
    using System.CodeDom; 

    using BoDi; 

    using TechTalk.SpecFlow.Generator; 
    using TechTalk.SpecFlow.Generator.Configuration; 
    using TechTalk.SpecFlow.Generator.Plugins; 
    using TechTalk.SpecFlow.Generator.UnitTestProvider; 
    using TechTalk.SpecFlow.UnitTestProvider; 
    using TechTalk.SpecFlow.Utils; 

    /// <summary> 
    /// The CodedUI generator plugin. 
    /// </summary> 
    public class CodedUIGeneratorPlugin : IGeneratorPlugin 
    { 
     /// <summary> 
     /// The register dependencies. 
     /// </summary> 
     /// <param name="container"> 
     /// The container. 
     /// </param> 
     public void RegisterDependencies(ObjectContainer container) 
     { 
     } 

     /// <summary> 
     /// The register customizations. 
     /// </summary> 
     /// <param name="container"> 
     /// The container. 
     /// </param> 
     /// <param name="generatorConfiguration"> 
     /// The generator configuration. 
     /// </param> 
     public void RegisterCustomizations(ObjectContainer container, SpecFlowProjectConfiguration generatorConfiguration) 
     { 
      container.RegisterTypeAs<CodedUIGeneratorProvider, IUnitTestGeneratorProvider>("default"); 
      container.RegisterTypeAs<MsTest2010RuntimeProvider, IUnitTestRuntimeProvider>("default"); 
     } 

     /// <summary> 
     /// The register configuration defaults. 
     /// </summary> 
     /// <param name="specFlowConfiguration"> 
     /// The spec flow configuration. 
     /// </param> 
     public void RegisterConfigurationDefaults(SpecFlowProjectConfiguration specFlowConfiguration) 
     { 
     } 
    } 

    /// <summary> 
    /// The CodedUI generator. 
    /// </summary> 
    public class CodedUIGeneratorProvider : MsTest2010GeneratorProvider 
    { 
     /// <summary> 
     /// Initializes a new instance of the <see cref="CodedUiGeneratorProvider"/> class. 
     /// </summary> 
     /// <param name="codeDomHelper"> 
     /// The code dom helper. 
     /// </param> 
     public CodedUIGeneratorProvider(CodeDomHelper codeDomHelper) 
      : base(codeDomHelper) 
     { 
     } 

     /// <summary> 
     /// The set test class. 
     /// </summary> 
     /// <param name="generationContext"> 
     /// The generation context. 
     /// </param> 
     /// <param name="featureTitle"> 
     /// The feature title. 
     /// </param> 
     /// <param name="featureDescription"> 
     /// The feature description. 
     /// </param> 
     public override void SetTestClass(TestClassGenerationContext generationContext, string featureTitle, string featureDescription) 
     { 
      base.SetTestClass(generationContext, featureTitle, featureDescription); 

      foreach (CodeAttributeDeclaration declaration in generationContext.TestClass.CustomAttributes) 
      { 
       if (declaration.Name == "Microsoft.VisualStudio.TestTools.UnitTesting.TestClassAttribute") 
       { 
        generationContext.TestClass.CustomAttributes.Remove(declaration); 
        break; 
       } 
      } 

      generationContext.TestClass.CustomAttributes.Add(new CodeAttributeDeclaration(new CodeTypeReference("Microsoft.VisualStudio.TestTools.UITesting.CodedUITestAttribute"))); 
     } 
    } 
} 

और इस प्रकार जब यह कॉन्फ़िगर करने के प्रयास के रूप में:

<specFlow> 
    <!-- For additional details on SpecFlow configuration options see http://go.specflow.org/doc-config --> 
    <plugins> 
     <add name="CodedUIGeneratorProvider" path="." type="GeneratorAndRuntime"/> 
    </plugins> 
    <generator dependencies="CodedUIGeneratorProvider"/> 
    <runtime dependencies="CodedUIGeneratorProvider"/> 
    </specFlow> 

मैं निम्न त्रुटि संदेश मिलता है:

error Generation error: SpecFlow configuration error -> The value of the property 'dependencies' cannot be parsed. The error is: Object reference not set to an instance of an object.

त्रुटि लगता है कि स्पेकफ़्लो कॉन्फ़िगरेशन कोड के अंदर त्रुटि उत्पन्न होती है, स्टैक ट्रेस इस प्रकार है:

System.Configuration.dll!System.Configuration.ConfigurationProperty.ConvertFromString(string value) + 0x2a bytes 
System.Configuration.dll!System.Configuration.ConfigurationElement.DeserializePropertyValue(System.Configuration.ConfigurationProperty prop, System.Xml.XmlReader reader) + 0x36 bytes 
System.Configuration.dll!System.Configuration.ConfigurationElement.DeserializeElement(System.Xml.XmlReader reader, bool serializeCollectionKey) + 0x221 bytes 
System.Configuration.dll!System.Configuration.ConfigurationElement.DeserializeElement(System.Xml.XmlReader reader, bool serializeCollectionKey) + 0x78e bytes 
System.Configuration.dll!System.Configuration.ConfigurationSection.DeserializeSection(System.Xml.XmlReader reader) + 0x3c bytes 
TechTalk.SpecFlow.dll!TechTalk.SpecFlow.Configuration.ConfigurationSectionHandler.CreateFromXml(string xmlContent) + 0xb0 bytes 
TechTalk.SpecFlow.Generator.dll!TechTalk.SpecFlow.Generator.Configuration.GeneratorConfigurationProvider.LoadConfiguration(TechTalk.SpecFlow.Generator.Interfaces.SpecFlowConfigurationHolder configurationHolder, TechTalk.SpecFlow.Generator.Configuration.SpecFlowProjectConfiguration configuration) + 0x41 bytes 
TechTalk.SpecFlow.Vs2010Integration.dll!TechTalk.SpecFlow.Vs2010Integration.Generator.VsGeneratorInfoProvider.GenGeneratorConfig() + 0x52 bytes 
TechTalk.SpecFlow.Vs2010Integration.dll!TechTalk.SpecFlow.Vs2010Integration.Generator.VsGeneratorInfoProvider.GetGeneratorInfo() + 0x3a bytes 
TechTalk.SpecFlow.IdeIntegration.dll!TechTalk.SpecFlow.IdeIntegration.Generator.RemoteGeneratorServices.GetGeneratorInfo() Line 38 + 0x9 bytesC# 
TechTalk.SpecFlow.IdeIntegration.dll!TechTalk.SpecFlow.IdeIntegration.Generator.RemoteGeneratorServices.GetTestGeneratorFactoryForCreate() Line 43 + 0xa bytesC# 
TechTalk.SpecFlow.IdeIntegration.dll!TechTalk.SpecFlow.IdeIntegration.Generator.GeneratorServices.CreateTestGenerator() Line 24 + 0xa bytesC# 
TechTalk.SpecFlow.IdeIntegration.dll!TechTalk.SpecFlow.IdeIntegration.Generator.IdeSingleFileGenerator.GenerateCode(string inputFilePath, string inputFileContent, TechTalk.SpecFlow.IdeIntegration.Generator.GeneratorServices generatorServices, TechTalk.SpecFlow.Generator.Interfaces.ProjectSettings projectSettings) Line 38 + 0x29 bytesC# 
TechTalk.SpecFlow.IdeIntegration.dll!TechTalk.SpecFlow.IdeIntegration.Generator.IdeSingleFileGenerator.Generate(string inputFilePath, string inputFileContent, TechTalk.SpecFlow.IdeIntegration.Generator.GeneratorServices generatorServices, TechTalk.SpecFlow.Utils.CodeDomHelper codeDomHelper, TechTalk.SpecFlow.Generator.Interfaces.ProjectSettings projectSettings) Line 23 + 0x12 bytesC# 
TechTalk.SpecFlow.IdeIntegration.dll!TechTalk.SpecFlow.IdeIntegration.Generator.IdeSingleFileGenerator.GenerateFile(string inputFilePath, string outputFilePath, System.Func<TechTalk.SpecFlow.IdeIntegration.Generator.GeneratorServices> generatorServicesProvider, System.Func<string,string> inputFileContentProvider, System.Action<string,string> outputFileContentWriter) Line 92 + 0x13 bytesC# 
TechTalk.SpecFlow.Vs2010Integration.dll!TechTalk.SpecFlow.VsIntegration.SingleFileGenerator.SpecFlowSingleFileGeneratorBase.GenerateInternal(string inputFilePath, string inputFileContent, EnvDTE.Project project, string defaultNamespace, System.Action<TechTalk.SpecFlow.VsIntegration.SingleFileGenerator.SingleFileGeneratorError> onError, out string generatedContent) + 0x18e bytes 
TechTalk.SpecFlow.Vs2010Integration.dll!TechTalk.SpecFlow.VsIntegration.SingleFileGenerator.SingleFileGeneratorBase.Generate(string inputFilePath, string inputFileContents, string defaultNamespace, System.IntPtr[] rgbOutputFileContents, out uint pcbOutput, Microsoft.VisualStudio.Shell.Interop.IVsGeneratorProgress generateProgress) + 0xc3 bytes 
[Native to Managed Transition] 

कौन सा परावर्तक बताता है मुझे केवल मतलब हो सकता है कि TechTalk.SpecFlow.IdeIntegration.Generator.RemoteGeneratorServices.generatorInfoProvidernull है।

मुझे इसे ठीक करने के तरीके पर एक नुकसान है। इसे हल करने के लिए बहुत कम दस्तावेज उपलब्ध हैं।

प्रश्न:

मैं प्राप्त कर सकते हैं अगर यह काम करने के लिए मैं बहुत खुशी होगी। वैकल्पिक रूप से मुझे SpecFlow स्थापना निर्देशिका में फ़ाइलों को रखने के बिना 'पुराने तरीके' को कॉन्फ़िगर करने का तरीका देखना अच्छा लगेगा।

उत्तर

1

SpecFlow 2.1.0 के साथ यहाँ आने डेवलपर्स के लिए, ऊपर CodedUIGeneratorProvider वर्ग के लिए निम्न जोड़ें:

public void Initialize(GeneratorPluginEvents generatorPluginEvents, GeneratorPluginParameters generatorPluginParameters) 
    { 
     generatorPluginEvents.CustomizeDependencies += GeneratorPluginEvents_CustomizeDependencies; 
    } 

    private void GeneratorPluginEvents_CustomizeDependencies(object sender, CustomizeDependenciesEventArgs eventArgs) 
    { 
     eventArgs.ObjectContainer.RegisterTypeAs<CodedUIGeneratorProvider, IUnitTestGeneratorProvider>(); 
    } 

CustomPlugin इंटरफेस के इंटरफेस बदल गया है, पंजीकृत अनुकूलन प्राप्त करने के लिए अनुकूलन घटनाओं को अपनाना आवश्यक है।

देखें https://github.com/techtalk/SpecFlow/wiki/Plugins

5

मैं इस मुद्दे :)

प्लगइन के रजिस्टर अनुकूलन विधि में पाया, एक नाम का उपयोग कर रजिस्टर मत करो, बस का उपयोग RegisterTypeAs विधि:

public void RegisterCustomizations(ObjectContainer container, SpecFlowProjectConfiguration generatorConfiguration) 
{ 
    container.RegisterTypeAs<CodedUIGeneratorProvider, IUnitTestGeneratorProvider>(); 
} 

फिर config बहुत ही सरल लग रहा है , इस तरह:

<specFlow> 
    <!-- For additional details on SpecFlow configuration options see http://go.specflow.org/doc-config --> 
    <plugins> 
    <add name="CodedUIGeneratorProvider" path="." type="Generator"/> 
    </plugins> 
</specFlow> 

इस तरह आप प्लगइन विधानसभा परियोजना निर्देशिका में (जो *.SpecflowPlugin.dll नामित किया जाना चाहिए) ड्रॉप कर सकते हैं, या एक रिश्तेदार पी का उपयोग परियोजना निर्देशिका से एथ और इसे plugins\add आइटम की संपत्ति में सेट करें।

अधिक जानकारी के लिए देखें: http://blog.jessehouwing.nl/2013/04/creating-custom-unit-test-generator.html

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