我在决定使用哪种设计模式时遇到了一些问题。我的问题如下:我必须构建一个测试平台,以对我工作的公司生产的物理设备进行一些测试。所以我有:
1)ITest接口,它是所有接口的父级:
interface ITest
{
string Description {get; set;}
void Run();
}
因此,特定的测试应该从该接口继承,并实现Description属性和Run方法。
2)TestManager类,其中包含要运行的测试的集合。它还可以对测试执行某些操作,例如,它具有RunAll方法,该方法可以运行它持有的所有测试。
class TestManager
{
public List<ITest> Tests {get; run;}
void RunAll()
{
foreach (var t in Tests)
{
t.Run();
}
}
}
现在,假设某些测试在运行之前需要进行一些准备。因此,我有ITest的子类型,其中有用于测试的准备文本:
interface IPreparableTest : ITest
{
string PreparationMessage {get; set; }
}
将以某种方式向用户提示此PreparationMessage,以便用户可以在我们要测试的设备上执行某些操作。但是,TestManager的责任是决定需要准备哪些测试以及以何种方式将PreparationMessage显示给用户。问题在于它拥有ITest的集合,因此必须区分可准备测试和普通测试。我当然可以写这样的东西:
RunAll()
{
foreach (var test in tests)
{
if (test is IPreparableTest)
{
MessageBox.Show(((IPreparableTest)test).PreparationMessage);
}
test.Run();
}
}
但是我不想这样写,因为它不是OOP风格。我想在这里使用某种模式,但是我不知道应该使用哪种模式。我也不想将准备逻辑放在测试中,因为这不是测试的责任,测试应该只包含有关如何准备设备的信息,但是如何向用户显示此消息取决于TestManager。因此,基本上我想学习避免打开对象类型的方法。
答案 0 :(得分:2)
您应该从现有的测试库(例如NUnit或XUnit)获得指导。它们具有可以在一组测试之前和之后以及每个测试之前和之后运行的方法。他们还使用反射来确定是否应该执行方法。
伪代码:
[TestClass]
class MyTests
{
[TestFixture]
public void ThisIsATest()
{
}
[BeforeAllTests]
public void OncePerClass()
{
}
[BeforeEachTest]
public void OncePerTest()
{
}
[AfterEachTest]
public void AfterEachTest()
{
}
[AfterAllTests]
public void AfterAllTests()
{
}
}