gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 20:55:13 25 4
gpt4 key购买 nike

我正在为两个在不同堆栈上支持相同功能的 API 编写 C# 测试驱动程序。大约有两打不同的功能。我正在使用 Spec Explorer 生成通用测试用例(在 JSON 中),这需要一个静态目标。通用测试用例被映射到特定接口(interface)以供输入并应用于被测接口(interface)。然后,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,在一个列表中定义所有的 methodName,然后对其进行迭代。

我想知道是否有一种方法可以减少 C# 中的代码量,类似于 Tcl 所做的。还是 C# 强类型意味着那是不可能的?或者,如果可能的话,这会不会太奇怪而不实用?

蒂亚

最佳答案

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

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 });

关于c# - 在 C# 中的不同堆栈上驱动相同 API 的优雅方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26192980/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com