使用 Moq 对针对封闭供应商 API 编写的 'plug-in' 代码进行单元测试
Unit Testing using Moq for 'plug-in' code written against closed vendor API
假设您有一个供应商应用程序(和关联的封闭供应商 API)调用客户编写的 C# 'plugin' 代码。插件实现供应商定义的抽象 类。例如
public class MyPlugin : AbstractVendorPlugin
{
public override VendorClass PluginMain(VendorClass vc, VendorFactory vf)
{
vc.AddCalculation("x => x*x");
ExecutionContext ec = vf.CreateExecutionContext();
vc.Execute(ec);
return vc;
}
}
传递到插件区域的 classes/factories 的句柄是由供应商应用程序创建的,不能在该应用程序之外创建(假设我们的构建服务器不能自发创建应用程序实例) .
我不确定如何继续使插件代码可单元测试。我能想到的唯一选择是将对象包装在接口中,然后将测试限制为测试用例,这些用例计算调用并验证这些调用的输入(如果它们是供应商对象,则无法验证输出)。这似乎没有多大价值。
这里还有我没看到的其他选项吗?像这样对插件范例进行单元测试有意义吗?
单元测试的目的是验证被测对象的行为。单元测试要快,不要依赖第三方。
集成测试的目的是验证端到端的行为。
所以你的单元测试方法是正确的。首先包装供应商对象,用您的模拟对象替换实际实现,断言您的代码以正确的方式使用正确的参数调用供应商的对象。你不应该执行完整的流程,因为它不是单元测试的责任。
假设您有一个供应商应用程序(和关联的封闭供应商 API)调用客户编写的 C# 'plugin' 代码。插件实现供应商定义的抽象 类。例如
public class MyPlugin : AbstractVendorPlugin
{
public override VendorClass PluginMain(VendorClass vc, VendorFactory vf)
{
vc.AddCalculation("x => x*x");
ExecutionContext ec = vf.CreateExecutionContext();
vc.Execute(ec);
return vc;
}
}
传递到插件区域的 classes/factories 的句柄是由供应商应用程序创建的,不能在该应用程序之外创建(假设我们的构建服务器不能自发创建应用程序实例) .
我不确定如何继续使插件代码可单元测试。我能想到的唯一选择是将对象包装在接口中,然后将测试限制为测试用例,这些用例计算调用并验证这些调用的输入(如果它们是供应商对象,则无法验证输出)。这似乎没有多大价值。
这里还有我没看到的其他选项吗?像这样对插件范例进行单元测试有意义吗?
单元测试的目的是验证被测对象的行为。单元测试要快,不要依赖第三方。
集成测试的目的是验证端到端的行为。
所以你的单元测试方法是正确的。首先包装供应商对象,用您的模拟对象替换实际实现,断言您的代码以正确的方式使用正确的参数调用供应商的对象。你不应该执行完整的流程,因为它不是单元测试的责任。