private void SetupTestClass(TestClassGenerationContext generationContext) { generationContext.TestClass.IsPartial = true; generationContext.TestClass.TypeAttributes |= TypeAttributes.Public; _linePragmaHandler.AddLinePragmaInitial(generationContext.TestClass, generationContext.Document.SourceFilePath); _testGeneratorProvider.SetTestClass(generationContext, generationContext.Feature.Name, generationContext.Feature.Description); _decoratorRegistry.DecorateTestClass(generationContext, out var featureCategories); if (featureCategories.Any()) { _testGeneratorProvider.SetTestClassCategories(generationContext, featureCategories); } var featureTagsField = new CodeMemberField(typeof(string[]), "_featureTags"); featureTagsField.InitExpression = _scenarioPartHelper.GetStringArrayExpression(generationContext.Feature.Tags); generationContext.TestClass.Members.Add(featureTagsField); }
private void GenerateTestBody( TestClassGenerationContext generationContext, StepsContainer scenario, CodeMemberMethod testMethod, SpecFlowFeature feature, CodeExpression additionalTagsExpression = null, ParameterSubstitution paramToIdentifier = null) { //call test setup //ScenarioInfo scenarioInfo = new ScenarioInfo("xxxx", tags...); CodeExpression tagsExpression; if (additionalTagsExpression == null) { tagsExpression = _scenarioPartHelper.GetStringArrayExpression(scenario.GetTags()); } else if (!scenario.HasTags()) { tagsExpression = additionalTagsExpression; } else { // merge tags list // var tags = tags1 // if (tags2 != null) // tags = Enumerable.ToArray(Enumerable.Concat(tags1, tags1)); testMethod.Statements.Add( new CodeVariableDeclarationStatement(typeof(string[]), "__tags", _scenarioPartHelper.GetStringArrayExpression(scenario.GetTags()))); tagsExpression = new CodeVariableReferenceExpression("__tags"); testMethod.Statements.Add( new CodeConditionStatement( new CodeBinaryOperatorExpression( additionalTagsExpression, CodeBinaryOperatorType.IdentityInequality, new CodePrimitiveExpression(null)), new CodeAssignStatement( tagsExpression, new CodeMethodInvokeExpression( new CodeTypeReferenceExpression(typeof(Enumerable)), "ToArray", new CodeMethodInvokeExpression( new CodeTypeReferenceExpression(typeof(Enumerable)), "Concat", tagsExpression, additionalTagsExpression))))); } AddVariableForTags(testMethod, tagsExpression); testMethod.Statements.Add( new CodeVariableDeclarationStatement(typeof(ScenarioInfo), "scenarioInfo", new CodeObjectCreateExpression(typeof(ScenarioInfo), new CodePrimitiveExpression(scenario.Name), new CodePrimitiveExpression(scenario.Description), tagsExpression))); GenerateScenarioInitializeCall(generationContext, scenario, testMethod); GenerateTestMethodBody(generationContext, scenario, testMethod, paramToIdentifier, feature); GenerateScenarioCleanupMethodCall(generationContext, testMethod); }