我正在为两个支持不同堆栈上相同功能的API编写C#测试驱动程序。大约有24个不同的功能。我正在使用Spec Explorer生成通用测试用例(使用JSON),这需要一个静态目标。通用测试用例映射到特定的输入接口,并应用于被测接口。然后,然后将来自IUT的输出映射回通用JSON格式,以允许比较来自每个API的响应。
我已经实现了这个可行但不优雅的代码结构,如下面的代码片段所示。
public static class TestDriver
{
private static StackOneAdapter S1Api = new StackOneAdapter();
private static StackOneAdapter S2Api = new StackTwoAdapter();
public static void FunctionA(string TestInputs, string ExpectedResults)
{
switch (TestMode)
{
case TestModes.StackOne:
S1Api.FunctionA(TestInputs, ExpectedResults);
break;
case TestModes.StackTwo:
S2Api.FunctionA(TestInputs, ExpectedResults);
break;
case TestModes.BOTH:
S1Api.FunctionA(TestInputs, ExpectedResults);
S2Api.FunctionA(TestInputs, ExpectedResults);
break;
case TestModes.NONE:
break;
}
}
public static void FunctionB(string TestInputs, string ExpectedResults) {}
...
public static void FunctionX(string TestInputs, string ExpectedResults) {}
}
abstract public class Adapter
{
public abstract string FunctionA(string Input, string ExpectedResult);
...
public abstract string FunctionX(string Input, string ExpectedResult);
}
abstract public class Adapter : StackOneAdapter
{
public abstract string FunctionA(string Input, string ExpectedResult)
{
// set up call to stack one, function A
// make the call
// catch exception
// serialize the response from stack one, function A and return that
}
...
public abstract string FunctionX(string Input, string ExpectedResult) {}
}
abstract public class Adapter : StackTwoAdapter
{
public abstract string FunctionA(string Input, string ExpectedResult) {}
...
public abstract string FunctionX(string Input, string ExpectedResult) {}
}
过去,我曾经使用Tcl这样的事情。我不会硬编码相同的方法名称,而是使用变量methodName,在列表中定义所有methodNames,然后迭代它。
我想知道是否有办法减少C#中的代码批量,类似于Tcl所做的。或者C#强类型是否意味着不可能?或者,如果可能的话,这实在太奇怪了吗?
蒂亚
答案 0 :(得分:0)
使用dynamic type。您需要在代码中提供方法名称和参数,将使用C#重载逻辑,但使用后期绑定。
dynamic foo = GetFoo();
foo.Method(arg1, arg2);
如果不够动态,请使用Dynamitey(ImpromptuInterface)。您将能够通过名称调用方法并在运行时构造参数。将使用C#重载逻辑。
object foo = GetFoo();
Dynamic.InvokeMember("Method", new object[]{ arg1, arg2 });
或者你可以使用好的Reflection。您将在运行时以您希望的方式解析方法。
object foo = GetFoo();
foo.GetType().GetMethod("Method").Invoke(foo, new object[]{ arg1, arg2 });