我遇到了使用specflow自定义插件的情况。使用specflow自定义插件,我有两个不同的项目,比如project_A和project_B。这两个项目都有自己的存储库。
Project_A具有下面的类(请找到代码片段):
public class CustomTestGeneratorProvider : IUnitTestGeneratorProvider
{
public CustomTestGeneratorProvider (CodeDomHelper codeDomHelper)
{
_unitTestGeneratorProvider = new
NUnit3TestGeneratorProvider(codeDomHelper);
CodeDomHelper = codeDomHelper;
}
public UnitTestGeneratorTraits GetTraits()
{
return _unitTestGeneratorProvider.GetTraits();
}
public void SetTestClass(TestClassGenerationContext generationContext, string featureTitle,
string featureDescription)
{
_unitTestGeneratorProvider.SetTestClass(generationContext, featureTitle, featureDescription);
generationContext.Namespace.Imports.Add(new CodeNamespaceImport("Com.MyOrg.Custom.Core.Feature"));
generationContext.TestClass.BaseTypes.Add("MyOrgTest");
}
public void SetTestClassCategories(TestClassGenerationContext generationContext,
IEnumerable<string> featureCategories)
{
_unitTestGeneratorProvider.SetTestClassCategories(generationContext, featureCategories);
}
Project_B具有下面的类(请找到代码片段):
public class CustomTestGeneratorProvider : IUnitTestGeneratorProvider
{
public CustomTestGeneratorProvider (CodeDomHelper codeDomHelper)
{
_unitTestGeneratorProvider = new
NUnit3TestGeneratorProvider(codeDomHelper);
CodeDomHelper = codeDomHelper;
}
public UnitTestGeneratorTraits GetTraits()
{
return _unitTestGeneratorProvider.GetTraits();
}
public void SetTestClass(TestClassGenerationContext generationContext, string featureTitle,
string featureDescription)
{
_unitTestGeneratorProvider.SetTestClass(generationContext, featureTitle, featureDescription);
}
public void SetTestClassCategories(TestClassGenerationContext generationContext,
IEnumerable<string> featureCategories)
{
_unitTestGeneratorProvider.SetTestClassCategories(generationContext, featureCategories);
}
如果您查看 SetTestClass 方法,则该类具有不同的逻辑实现。这是对我唯一的维护方法。请注意,两个项目都做相同的事情,但它们的用户不同。发布时如果我在project_A中进行更改,我也应该注意或考虑project_B。
我想尽量减少这种维护。我该怎么做以减少维护?如何避免代码重复?在这种情况下。
答案 0 :(得分:1)
获取类的所有公共部分,并从中创建一个抽象基类。
离开SetTestClass
方法abstract
。
将此类放在单独的dll中:
public abstract class TestGeneratorProvider : IUnitTestGeneratorProvider
{
public CustomTestGeneratorProvider (CodeDomHelper codeDomHelper)
{
_unitTestGeneratorProvider = new
NUnit3TestGeneratorProvider(codeDomHelper);
CodeDomHelper = codeDomHelper;
}
public UnitTestGeneratorTraits GetTraits()
{
return _unitTestGeneratorProvider.GetTraits();
}
public abstract void SetTestClass(TestClassGenerationContext generationContext, string featureTitle,
string featureDescription)
public void SetTestClassCategories(TestClassGenerationContext generationContext,
IEnumerable<string> featureCategories)
{
_unitTestGeneratorProvider.SetTestClassCategories(generationContext, featureCategories);
}
}
在项目A中,添加对该dll的引用,继承该类并提供相关的SetTestClass
实现:
public class CustomTestGeneratorProvider : TestGeneratorProvider
{
public override void SetTestClass(TestClassGenerationContext generationContext, string featureTitle,
string featureDescription)
{
_unitTestGeneratorProvider.SetTestClass(generationContext, featureTitle, featureDescription);
generationContext.Namespace.Imports.Add(new CodeNamespaceImport("Com.MyOrg.Custom.Core.Feature"));
generationContext.TestClass.BaseTypes.Add("MyOrgTest");
}
}
在项目B中做同样的事情:
public class CustomTestGeneratorProvider : TestGeneratorProvider
{
public override void SetTestClass(TestClassGenerationContext generationContext, string featureTitle,
string featureDescription)
{
_unitTestGeneratorProvider.SetTestClass(generationContext, featureTitle, featureDescription);
}
}
答案 1 :(得分:0)
使用此类和方法的“基本实现”创建一个单独的项目。如果您需要专门对一个进行修改,请使用override覆盖该方法。
参考:https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/override