好吧,我明白了。花了几个步骤:
在查看了GitHub上的源代码后,我发现UnitTestFeatureGenerator
它似乎是负责将规范流文件转换为单元测试的类。
然后我创建了一个继承自的新类UnitTestFeatureGenerator
并隐藏GenerateUnitTestFixture
来自基类的方法。
在我的身体里GenerateUnitTestFixture
类,然后我在交接之前将所需的额外步骤添加到场景中base.GenerateUnitTestFixture
生成单元测试。这是它的要点:
public class MultiThemeUnitTestFeatureGenerator : UnitTestFeatureGenerator, IFeatureGenerator
{
public MultiThemeUnitTestFeatureGenerator(IUnitTestGeneratorProvider testGeneratorProvider, CodeDomHelper codeDomHelper, GeneratorConfiguration generatorConfiguration, IDecoratorRegistry decoratorRegistry)
: base(testGeneratorProvider, codeDomHelper, generatorConfiguration, decoratorRegistry)
{}
public new CodeNamespace GenerateUnitTestFixture(Feature feature, string testClassName, string targetNamespace)
{
foreach (var scenario in feature.Scenarios)
{
scenario.Steps.Insert(0, new Given {Text = "Given I have <Theme> set as my current theme"});
//add any other steps you need....
}
return base.GenerateUnitTestFixture(feature, testClassName, targetNamespace);
}
}
一旦我完成了所有这些设置,我需要一种方法来告诉specflow使用我的新类而不是当前注册的类UnitTestFeatureGenerator
。这是一个复杂的工作,因为文档几乎只是说“即将推出”。值得庆幸的是,我找到了一篇出色的博客文章,其中概述了所有陷阱。 https://jessehouwing.net/specflow-custom-unit-test-generator/
My IGeneratorPlugin
实现看起来像这样:
public class MultiThemeGeneratorPlugin : IGeneratorPlugin
{
public void RegisterDependencies(ObjectContainer container)
{}
public void RegisterCustomizations(ObjectContainer container, SpecFlowProjectConfiguration generatorConfiguration)
{
container.RegisterTypeAs<MultiThemeFeatureGeneratorProvider, IFeatureGeneratorProvider>("default");
}
public void RegisterConfigurationDefaults(SpecFlowProjectConfiguration specFlowConfiguration)
{}
}
注意我注册了IFeatureGeneratorProvider
相对于IFeatureGenerator
。我必须创建一个实现IFeatureGeneratorProvider
返回一个实现的实例IFeatureGenerator
我感兴趣的是:
public class MultiThemeFeatureGeneratorProvider : IFeatureGeneratorProvider
{
private readonly ObjectContainer _container;
public MultiThemeFeatureGeneratorProvider(ObjectContainer container)
{
_container = container;
}
public int Priority
{
get { return int.MaxValue; }
}
public bool CanGenerate(Feature feature)
{
return true;
}
public IFeatureGenerator CreateGenerator(Feature feature)
{
return _container.Resolve<MultiThemeUnitTestFeatureGenerator>();
}
}