コード例 #1
0
        public void AddFeatureFile(string featureFileText)
        {
            var featureFile = new FeatureFileInput(GetFeatureFileName(), featureFileText);

            FeatureFiles.Add(featureFile);
            CurrentFeatureFile = featureFile;
        }
コード例 #2
0
        public TestGeneratorResult GenerateTestFile(FeatureFileInput featureFileInput, GenerationSettings settings)
        {
            if (featureFileInput == null)
            {
                throw new ArgumentNullException("featureFileInput");
            }
            if (settings == null)
            {
                throw new ArgumentNullException("settings");
            }

            try
            {
                return(GenerateTestFileWithExceptions(featureFileInput, settings));
            }
            catch (ParserException parserException)
            {
                return(new TestGeneratorResult(parserException.GetParserExceptions().Select(
                                                   ex => new TestGenerationError(ex.Location == null ? 0 : ex.Location.Line, ex.Location == null ? 0 : ex.Location.Column, ex.Message))));
            }
            catch (Exception exception)
            {
                return(new TestGeneratorResult(new TestGenerationError(exception)));
            }
        }
コード例 #3
0
        protected string GetGeneratedTestCode(FeatureFileInput featureFileInput)
        {
            using (var outputWriter = new IndentProcessingWriter(new StringWriter()))
            {
                var codeProvider  = codeDomHelper.CreateCodeDomProvider();
                var codeNamespace = GenerateTestFileCode(featureFileInput);

                if (codeNamespace == null)
                {
                    return("");
                }

                var options = new CodeGeneratorOptions
                {
                    BracingStyle = "C",
                };

                AddSpecFlowHeader(codeProvider, outputWriter);
                codeProvider.GenerateCodeFromNamespace(codeNamespace, outputWriter, options);
                AddSpecFlowFooter(codeProvider, outputWriter);

                outputWriter.Flush();
                var generatedTestCode = outputWriter.ToString();
                return(FixVBNetGlobalNamespace(generatedTestCode));
            }
        }
        SpecFlowDocument GenerateTestFileCode(FeatureFileInput featureFileInput)
        {
            var parser = _gherkinParserFactory.Create(_generatorConfiguration.FeatureLanguage);

            using (var contentReader = featureFileInput.GetFeatureFileContentReader(_projectSettings))
                return(parser.Parse(contentReader, featureFileInput.GetFullPath(_projectSettings)));
        }
コード例 #5
0
        public string Generate(string projectFolder, string configFilePath, string targetExtension, string featureFilePath, string targetNamespace, string projectDefaultNamespace, bool saveResultToFile)
        {
            using (var generator = CreateGenerator(projectFolder, configFilePath, targetExtension, projectDefaultNamespace))
            {
                var featureFileInput =
                    new FeatureFileInput(FileSystemHelper.GetRelativePath(featureFilePath, projectFolder))
                {
                    CustomNamespace = targetNamespace
                };

                var generationSettings = new GenerationSettings
                {
                    CheckUpToDate     = false,
                    WriteResultToFile = saveResultToFile
                };
                var result          = generator.GenerateTestFile(featureFileInput, generationSettings);
                var connectorResult = new GenerationResult();
                if (result.Success)
                {
                    connectorResult.FeatureFileCodeBehind = new FeatureFileCodeBehind
                    {
                        FeatureFilePath = featureFilePath,
                        Content         = result.GeneratedTestCode
                    };
                }
                else
                {
                    connectorResult.ErrorMessage =
                        string.Join(Environment.NewLine, result.Errors.Select(e => e.Message));
                }

                var resultJson = JsonSerialization.SerializeObject(connectorResult);
                return(resultJson);
            }
        }
コード例 #6
0
        public static string GetGeneratedTestContent(this FeatureFileInput featureFileInput, string generatedTestFullPath)
        {
            var generatedTestFileContent = featureFileInput.GeneratedTestFileContent;

            if (generatedTestFileContent != null)
            {
                return(generatedTestFileContent);
            }

            if (generatedTestFullPath == null)
            {
                return(null);
            }

            try
            {
                if (!File.Exists(generatedTestFullPath))
                {
                    return(null);
                }

                return(File.ReadAllText(generatedTestFullPath));
            }
            catch (Exception exception)
            {
                Debug.WriteLine(exception, "FeatureFileInputExtensions.GetGeneratedTestContent");
                return(null);
            }
        }
コード例 #7
0
 private void GenerateTestFile(FeatureFileInput featureFile, CodeDomProvider codeProvider, TextWriter outputWriter)
 {
     using (var reader = new StreamReader(featureFile.GetFullPath(project.ProjectSettings)))
     {
         GenerateTestFile(featureFile, codeProvider, reader, outputWriter);
     }
 }
        public void Should_be_able_generate_from_a_simple_valid_feature()
        {
            using (var remoteFactory = CreateRemoteAppDomainTestGeneratorFactory())
            {
                var generator = remoteFactory.CreateGenerator(new ProjectSettings()
                {
                    ProjectFolder = Path.GetTempPath()
                });

                FeatureFileInput featureFileInput = new FeatureFileInput("Test.feature")
                {
                    FeatureFileContent = @"
Feature: Addition

@mytag
Scenario: Add two numbers
	Given I have entered 50 into the calculator
	And I have entered 70 into the calculator
	When I press add
	Then the result should be 120 on the screen
"
                };
                var result = generator.GenerateTestFile(featureFileInput, new GenerationSettings());

                result.Should().NotBeNull();
                result.Success.Should().BeTrue();
                result.GeneratedTestCode.Should().NotBeNull();
            }
        }
コード例 #9
0
        public Version DetectGeneratedTestVersion(FeatureFileInput featureFileInput)
        {
            if (!_integrationOptions.LegacyEnableSpecFlowSingleFileGeneratorCustomTool)
            {
                return(null);
            }


            var featureFileInputFile = WriteTempFile(featureFileInput);


            var result = _outOfProcessExecutor.Execute(new DetectGeneratedTestVersionParameters()
            {
                FeatureFile = featureFileInputFile,
                Debug       = Debugger.IsAttached
            }, false);


            if (result.ExitCode > 0)
            {
                throw new Exception(result.Output);
            }

            return(Version.Parse(result.Output));
        }
コード例 #10
0
        private SpecFlowProject CreateSpecFlowProjectFrom(IProject project)
        {
            var specFlowProject = new SpecFlowProject();

            specFlowProject.ProjectSettings.ProjectFolder    = project.Directory;
            specFlowProject.ProjectSettings.ProjectName      = project.Name;
            specFlowProject.ProjectSettings.AssemblyName     = project.AssemblyName;
            specFlowProject.ProjectSettings.DefaultNamespace = project.RootNamespace;

            var generatorConfig = specFlowProject.Configuration.GeneratorConfiguration;

            foreach (var projectFile in project.Items.OfType <FileProjectItem>().Where(IsFeatureOrAppConfigFile))
            {
                string extension = Path.GetExtension(projectFile.FileName);
                if (extension != null && extension.Equals(".feature", StringComparison.InvariantCultureIgnoreCase))
                {
                    string fileName    = FileUtilities.GetRelativePath(projectFile.FileName, project.Directory);
                    var    featureFile = new FeatureFileInput(fileName);

                    specFlowProject.FeatureFiles.Add(featureFile);
                }

                if (extension != null && extension.Equals(".config", StringComparison.InvariantCultureIgnoreCase))
                {
                    string configContent = File.ReadAllText(projectFile.FileName);
                    GeneratorConfigurationReader.UpdateConfigFromFileContent(generatorConfig, configContent);
                }
            }

            return(specFlowProject);
        }
        public void Should_be_able_generate_from_a_simple_invalid_feature()
        {
            using (var remoteFactory = CreateRemoteAppDomainTestGeneratorFactory())
            {
                var generator = remoteFactory.CreateGenerator(new ProjectSettings()
                {
                    ProjectFolder = Path.GetTempPath()
                });

                FeatureFileInput featureFileInput = new FeatureFileInput("Test.feature")
                {
                    FeatureFileContent = @"
Feature: Addition
Scenario: Add two numbers
	Given I have entered 50 into the calculator
    AndXXX the keyword is misspelled
"
                };
                var result = generator.GenerateTestFile(featureFileInput, new GenerationSettings());

                result.Should().NotBeNull();
                result.Success.Should().BeFalse();
                result.Errors.Should().NotBeNull();
                result.Errors.Should().NotBeEmpty();
            }
        }
コード例 #12
0
        public TestGeneratorResult GenerateTestFile(FeatureFileInput featureFileInput, GenerationSettings settings)
        {
            if (featureFileInput == null)
            {
                throw new ArgumentNullException("featureFileInput");
            }
            if (settings == null)
            {
                throw new ArgumentNullException("settings");
            }

            try
            {
                return(GenerateTestFileWithExceptions(featureFileInput, settings));
            }
            catch (SpecFlowParserException parserException)
            {
                if (parserException.ErrorDetails == null || parserException.ErrorDetails.Count == 0)
                {
                    return(new TestGeneratorResult(new TestGenerationError(parserException)));
                }

                return(new TestGeneratorResult(parserException.ErrorDetails.Select(
                                                   ed => new TestGenerationError(ed.ForcedLine - 1, ed.ForcedColumn - 1, ed.Message))));
            }
            catch (Exception exception)
            {
                return(new TestGeneratorResult(new TestGenerationError(exception)));
            }
        }
コード例 #13
0
        public static SpecFlowProject LoadSpecFlowProjectFromDteProject(Project project)
        {
            string projectFolder = Path.GetDirectoryName(project.FullName);

            SpecFlowProject specFlowProject = new SpecFlowProject();

            specFlowProject.ProjectSettings.ProjectFolder    = projectFolder;
            specFlowProject.ProjectSettings.ProjectName      = Path.GetFileNameWithoutExtension(project.FullName);
            specFlowProject.ProjectSettings.AssemblyName     = project.Properties.Item("AssemblyName").Value as string;
            specFlowProject.ProjectSettings.DefaultNamespace = project.Properties.Item("DefaultNamespace").Value as string;

            foreach (ProjectItem projectItem in GetAllProjectItem(project).Where(IsPhysicalFile))
            {
                var fileName = GetRelativePath(GetFileName(projectItem), projectFolder);

                var extension = Path.GetExtension(fileName);
                if (extension.Equals(".feature", StringComparison.InvariantCultureIgnoreCase))
                {
                    var featureFile = new FeatureFileInput(fileName);
                    var ns          = projectItem.Properties.Item("CustomToolNamespace").Value as string;
                    if (!String.IsNullOrEmpty(ns))
                    {
                        featureFile.CustomNamespace = ns;
                    }
                    specFlowProject.FeatureFiles.Add(featureFile);
                }

                if (Path.GetFileName(fileName).Equals("app.config", StringComparison.InvariantCultureIgnoreCase))
                {
                    GeneratorConfigurationReader.UpdateConfigFromFileContent(specFlowProject.Configuration.GeneratorConfiguration, GetFileContent(projectItem));
                }
            }
            return(specFlowProject);
        }
コード例 #14
0
        private string GetTargetNamespace(FeatureFileInput featureFile)
        {
            if (!string.IsNullOrEmpty(featureFile.CustomNamespace))
            {
                return(featureFile.CustomNamespace);
            }

            if (string.IsNullOrEmpty(project.ProjectSettings.DefaultNamespace))
            {
                return(null);
            }

            string targetNamespace  = project.ProjectSettings.DefaultNamespace;
            string projectFolder    = project.ProjectSettings.ProjectFolder;
            string sourceFileFolder = Path.GetDirectoryName(featureFile.GetFullPath(project.ProjectSettings));

            if (sourceFileFolder.StartsWith(sourceFileFolder, StringComparison.InvariantCultureIgnoreCase))
            {
                string extraFolders = sourceFileFolder.Substring(projectFolder.Length);
                if (extraFolders.Length > 0)
                {
                    string[] parts = extraFolders.TrimStart('\\').Split('\\');
                    targetNamespace += "." + string.Join(".",
                                                         parts.Select(p => p.ToIdentifier()).ToArray());
                }
            }
            return(targetNamespace);
        }
コード例 #15
0
        public TestFileGeneratorResult GenerateCodeBehindFile(string featureFile)
        {
            var featureFileInput         = new FeatureFileInput(featureFile);
            var generatedFeatureFileName = Path.GetFileName(_testGenerator.GetTestFullPath(featureFileInput));

            var testGeneratorResult = _testGenerator.GenerateTestFile(featureFileInput, new GenerationSettings());

            return(new TestFileGeneratorResult(testGeneratorResult, generatedFeatureFileName));
        }
コード例 #16
0
        protected override FeatureFileInput CreateFeatureFileInput(FeatureFileInput featureFile, ITestGenerator generator, SpecFlowProject specFlowProject)
        {
            var featureFileInput = base.CreateFeatureFileInput(featureFile, generator, specFlowProject);

            outputFile = task.PrepareOutputFile(generator.GetTestFullPath(featureFileInput));
            featureFileInput.GeneratedTestProjectRelativePath =
                FileSystemHelper.GetRelativePath(outputFile.FilePathForWriting, specFlowProject.ProjectSettings.ProjectFolder);
            return(featureFileInput);
        }
コード例 #17
0
        private FeatureFileInput CreateFeatureFileInput(string file, XElement customNamespace)
        {
            var featureFile = new FeatureFileInput(file);

            if (customNamespace != null)
            {
                featureFile.CustomNamespace = customNamespace.Value;
            }
            return(featureFile);
        }
コード例 #18
0
        private IEnumerable <FeatureFileInput> GetFeatureFiles(XDocument xDocument, bool newProjectSystem, string projectFolder)
        {
            var nodesWhereFeatureFilesCouldBe = GetNotCompileableNodes(xDocument, newProjectSystem);

            var result = new List <FeatureFileInput>();

            foreach (var xElement in nodesWhereFeatureFilesCouldBe)
            {
                var include = xElement.Attribute("Include")?.Value;
                var update  = xElement.Attribute("Update")?.Value;

                if (string.IsNullOrWhiteSpace(include) && string.IsNullOrWhiteSpace(update))
                {
                    continue;
                }

                var fileName = string.IsNullOrWhiteSpace(update) ? include : update;

                if (IsAFeatureFile(fileName))
                {
                    var featureFile = new FeatureFileInput(fileName);

                    var customNamespace = xElement.Descendants(GetNameWithNamespace("CustomToolNamespace", newProjectSystem)).SingleOrDefault();
                    if (customNamespace != null)
                    {
                        featureFile.CustomNamespace = customNamespace.Value;
                    }

                    result.Add(featureFile);
                }
            }

            if (newProjectSystem)
            {
                var allFilesInProjectFolder = Directory.EnumerateFiles(projectFolder, "*", SearchOption.AllDirectories);

                foreach (var file in allFilesInProjectFolder)
                {
                    if (IsAFeatureFile(Path.GetFileName(file)))
                    {
                        if (result.Any(i => file.EndsWith(i.ProjectRelativePath)))
                        {
                            continue;
                        }

                        var realtivePath = file.Replace(projectFolder, "").Trim('\\');

                        result.Add(new FeatureFileInput(realtivePath));
                    }
                }
            }

            return(result);
        }
コード例 #19
0
        public string GetTestFullPath(FeatureFileInput featureFileInput)
        {
            var path = featureFileInput.GetGeneratedTestFullPath(projectSettings);

            if (path != null)
            {
                return(path);
            }

            return(featureFileInput.GetFullPath(projectSettings) + GenerationTargetLanguage.GetExtension(projectSettings.ProjectPlatformSettings.Language));
        }
コード例 #20
0
        public void Should_return_unknown_version_when_there_is_an_error()
        {
            TestHeaderWriterStub.Setup(thw => thw.DetectGeneratedTestVersion("any")).Throws(new Exception());

            var testGenerator = CreateTestGenerator();
            FeatureFileInput featureFileInput = CreateSimpleValidFeatureFileInput();

            featureFileInput.GeneratedTestFileContent = "any";
            var result = testGenerator.DetectGeneratedTestVersion(featureFileInput);

            result.Should().Be(null);
        }
コード例 #21
0
 private TestGeneratorResult GenerateCode(string inputFilePath, string inputFileContent, GeneratorServices generatorServices, ProjectSettings projectSettings)
 {
     using (var testGenerator = generatorServices.CreateTestGenerator())
     {
         var fullPath = Path.GetFullPath(Path.Combine(projectSettings.ProjectFolder, inputFilePath));
         FeatureFileInput featureFileInput =
             new FeatureFileInput(FileSystemHelper.GetRelativePath(fullPath, projectSettings.ProjectFolder))
         {
             FeatureFileContent = inputFileContent
         };
         return(testGenerator.GenerateTestFile(featureFileInput, new GenerationSettings()));
     }
 }
コード例 #22
0
        public SpecFlowProject ReadSpecFlowProject(string projectFilePath)
        {
            var specFlowProject = new SpecFlowProject();

            Microsoft.Build.Evaluation.Project project = null;
            string projectFolder = Path.GetDirectoryName(projectFilePath);

            try
            {
                var reader = XmlReader.Create(projectFilePath);
                project = ProjectCollection.GlobalProjectCollection.LoadProject(reader);


                specFlowProject.ProjectSettings.ProjectFolder    = projectFolder;
                specFlowProject.ProjectSettings.ProjectName      = Path.GetFileNameWithoutExtension(projectFilePath);
                specFlowProject.ProjectSettings.AssemblyName     = project.AllEvaluatedProperties.First(x => x.Name == "AssemblyName").EvaluatedValue;
                specFlowProject.ProjectSettings.DefaultNamespace = project.AllEvaluatedProperties.First(x => x.Name == "RootNamespace").EvaluatedValue;
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex, "Project load error");
                return(new SpecFlowProject());
            }


            specFlowProject.ProjectSettings.ProjectPlatformSettings.Language = GetLanguage(project);

            foreach (ProjectItem item in project.FeatureFiles())
            {
                var featureFile = new FeatureFileInput(item.EvaluatedInclude);
                var ns          = item.GetMetadataValue("CustomToolNamespace");
                if (!String.IsNullOrEmpty(ns))
                {
                    featureFile.CustomNamespace = ns;
                }
                specFlowProject.FeatureFiles.Add(featureFile);
            }

            ProjectItem appConfigItem = project.ApplicationConfigurationFile();

            if (appConfigItem != null)
            {
                var configFilePath      = Path.Combine(projectFolder, appConfigItem.EvaluatedInclude);
                var configFileContent   = File.ReadAllText(configFilePath);
                var configurationHolder = GetConfigurationHolderFromFileContent(configFileContent);
                specFlowProject.ProjectSettings.ConfigurationHolder = configurationHolder;
                specFlowProject.Configuration = configurationLoader.LoadConfiguration(configurationHolder);
            }

            return(specFlowProject);
        }
コード例 #23
0
        public static string GetFullPath(this FeatureFileInput featureFileInput, ProjectSettings projectSettings)
        {
            if (featureFileInput == null)
            {
                throw new ArgumentNullException("featureFileInput");
            }

            if (projectSettings == null)
            {
                return(featureFileInput.ProjectRelativePath);
            }

            return(Path.GetFullPath(Path.Combine(projectSettings.ProjectFolder, featureFileInput.ProjectRelativePath)));
        }
コード例 #24
0
        public TestGeneratorResult GenerateTestFile(FeatureFileInput featureFileInput, GenerationSettings settings)
        {
            string projectSettingsFile  = WriteTempFile(_projectSettings);
            var    featureFileInputFile = WriteTempFile(featureFileInput);

            var result = _outOfProcessExecutor.Execute(new GenerateTestFileParameters()
            {
                FeatureFile         = featureFileInputFile,
                ProjectSettingsFile = projectSettingsFile,
                Debug = Debugger.IsAttached,
            }, true);

            return(new TestGeneratorResult(result.Output, true));
        }
コード例 #25
0
        public SpecFlowProject ReadSpecFlowProject(IProjectReference projectReference)
        {
            var projectFilePath = FileProjectReference.AssertFileProjectReference(projectReference).ProjectFilePath;

            var project = Engine.GlobalEngine.GetLoadedProject(projectFilePath);

            if (project == null)
            {
                project = new Microsoft.Build.BuildEngine.Project();
                project.Load(projectFilePath, ProjectLoadSettings.IgnoreMissingImports);
            }

            string projectFolder = Path.GetDirectoryName(projectFilePath);

            SpecFlowProject specFlowProject = new SpecFlowProject();

            specFlowProject.ProjectSettings.ProjectFolder    = projectFolder;
            specFlowProject.ProjectSettings.ProjectName      = Path.GetFileNameWithoutExtension(projectFilePath);
            specFlowProject.ProjectSettings.AssemblyName     = project.GetEvaluatedProperty("AssemblyName");
            specFlowProject.ProjectSettings.DefaultNamespace = project.GetEvaluatedProperty("RootNamespace");

            var items = project.GetEvaluatedItemsByName("None").Cast <BuildItem>()
                        .Concat(project.GetEvaluatedItemsByName("Content").Cast <BuildItem>());

            foreach (BuildItem item in items)
            {
                var extension = Path.GetExtension(item.FinalItemSpec);
                if (extension.Equals(".feature", StringComparison.InvariantCultureIgnoreCase))
                {
                    var featureFile = new FeatureFileInput(item.FinalItemSpec);
                    var ns          = item.GetEvaluatedMetadata("CustomToolNamespace");
                    if (!String.IsNullOrEmpty(ns))
                    {
                        featureFile.CustomNamespace = ns;
                    }
                    specFlowProject.FeatureFiles.Add(featureFile);
                }

                if (Path.GetFileName(item.FinalItemSpec).Equals("app.config", StringComparison.InvariantCultureIgnoreCase))
                {
                    var configFilePath      = Path.Combine(projectFolder, item.FinalItemSpec);
                    var configFileContent   = File.ReadAllText(configFilePath);
                    var configurationHolder = GetConfigurationHolderFromFileContent(configFileContent);
                    specFlowProject.ProjectSettings.ConfigurationHolder = configurationHolder;
                    specFlowProject.Configuration = configurationLoader.LoadConfiguration(configurationHolder, projectReference);
                }
            }
            return(specFlowProject);
        }
コード例 #26
0
        public void Should_return_detected_version()
        {
            Version version = new Version();

            TestHeaderWriterStub.Setup(thw => thw.DetectGeneratedTestVersion("any")).Returns(version);

            var testGenerator = CreateTestGenerator();
            FeatureFileInput featureFileInput = CreateSimpleValidFeatureFileInput();

            featureFileInput.GeneratedTestFileContent = "any";
            var result = testGenerator.DetectGeneratedTestVersion(featureFileInput);

            result.Should().NotBeNull();
            result.Should().Be(version);
        }
コード例 #27
0
        public bool?IsUpToDatePreliminary(FeatureFileInput featureFileInput, string generatedTestFullPath, UpToDateCheckingMethod upToDateCheckingMethod)
        {
            bool byUpdateTimeCheckResult = IsUpToDateByModificationTimeAndGeneratorVersion(featureFileInput, generatedTestFullPath);

            if (upToDateCheckingMethod == UpToDateCheckingMethod.ModificationTimeAndGeneratorVersion)
            {
                return(byUpdateTimeCheckResult);
            }

            if (byUpdateTimeCheckResult == false)
            {
                return(false);
            }

            return(null);
        }
コード例 #28
0
        public static TextReader GetFeatureFileContentReader(this FeatureFileInput featureFileInput, ProjectSettings projectSettings)
        {
            if (featureFileInput == null)
            {
                throw new ArgumentNullException("featureFileInput");
            }

            if (featureFileInput.FeatureFileContent != null)
            {
                return(new StringReader(featureFileInput.FeatureFileContent));
            }

            Debug.Assert(projectSettings != null);

            return(new StreamReader(Path.Combine(projectSettings.ProjectFolder, featureFileInput.ProjectRelativePath)));
        }
コード例 #29
0
        public void GenerateTestFile(FeatureFileInput featureFile, CodeDomProvider codeProvider, TextReader inputReader, TextWriter outputWriter)
        {
            outputWriter = new IndentProcessingWriter(outputWriter);

            CodeDomHelper codeDomHelper = new CodeDomHelper(codeProvider);

            var codeNamespace = GenerateTestFileCode(featureFile, inputReader, codeProvider, codeDomHelper);
            var options       = new CodeGeneratorOptions
            {
                BracingStyle = "C"
            };

            AddSpecFlowHeader(codeProvider, outputWriter, codeDomHelper);
            codeProvider.GenerateCodeFromNamespace(codeNamespace, outputWriter, options);
            AddSpecFlowFooter(codeProvider, outputWriter, codeDomHelper);
            outputWriter.Flush();
        }
コード例 #30
0
        public CodeNamespace GenerateTestFileCode(FeatureFileInput featureFile, TextReader inputReader, CodeDomProvider codeProvider, CodeDomHelper codeDomHelper)
        {
            string targetNamespace = GetTargetNamespace(featureFile);

            SpecFlowLangParser parser  = new SpecFlowLangParser(project.Configuration.GeneratorConfiguration.FeatureLanguage);
            Feature            feature = parser.Parse(inputReader, featureFile.GetFullPath(project.ProjectSettings));

            IUnitTestGeneratorProvider generatorProvider = ConfigurationServices.CreateInstance <IUnitTestGeneratorProvider>(project.Configuration.GeneratorConfiguration.GeneratorUnitTestProviderType);

            codeDomHelper.InjectIfRequired(generatorProvider);

            ISpecFlowUnitTestConverter testConverter = new SpecFlowUnitTestConverter(generatorProvider, codeDomHelper, project.Configuration.GeneratorConfiguration);

            var codeNamespace = testConverter.GenerateUnitTestFixture(feature, null, targetNamespace);

            return(codeNamespace);
        }