在C#中在不同堆栈上驱动相同API的优雅方法是什么?

时间:2014-10-04 12:46:58

标签: c# json testing tcl

我正在为两个支持不同堆栈上相同功能的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#强类型是否意味着不可能?或者,如果可能的话,这实在太奇怪了吗?

蒂亚

1 个答案:

答案 0 :(得分:0)

使用dynamic type。您需要在代码中提供方法名称和参数,将使用C#重载逻辑,但使用后期绑定。

dynamic foo = GetFoo();
foo.Method(arg1, arg2);

如果不够动态,请使用DynamiteyImpromptuInterface)。您将能够通过名称调用方法并在运行时构造参数。将使用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 });