如何围绕C代码对托管包装器进行单元测试?

如何围绕C代码对托管包装器进行单元测试?,c,visual-studio-2010,unit-testing,dependency-injection,managed-c++,C,Visual Studio 2010,Unit Testing,Dependency Injection,Managed C++,我将围绕一些C函数创建一个托管C++包装器,以允许它在其他.NET解决方案中使用。我正在考虑提供一个非常简约的包装,比如: C标题中的签名: void DOSTH(const char*, short, long*); 公开的托管接口: public void doSomething(String^ input, short param, [Out] long^ %result); 为此,我的解决方案将具有C头,并将引用包含编译后的C API的.dll(我正在构建该API) 作为一名Visu

我将围绕一些C函数创建一个托管C++包装器,以允许它在其他.NET解决方案中使用。我正在考虑提供一个非常简约的包装,比如:

C标题中的签名:

void DOSTH(const char*, short, long*);
公开的托管接口:

public void doSomething(String^ input, short param, [Out] long^ %result);
为此,我的解决方案将具有C头,并将引用包含编译后的C API的.dll(我正在构建该API)

作为一名VisualStudio新手,我不确定如何进行单元测试。是否可以模拟.dll以提供模拟实现?有没有一个图书馆可以使这类任务变得简单?是否有一个特定的解决方案结构,我应该致力于使这更容易


这方面的任何指导都会很好。谷歌搜索让我想了解更多关于托管包装器单元测试的信息。

您是否只需要能够存根/模拟您的包装器,以便您的测试不依赖于本机dll

然后,您可以为包装器声明一个抽象基类,编写一个调用本机dll的实现,以及另一个出于测试目的返回固定值的实现。或者您可以使用类似或的框架来模拟包装器。

在某些情况下(我想到了工具限制和/或依赖复杂性),使用外部框架模拟依赖是不可能的。然后,有一种完全合法的手工编写mock的技术(我认为这是mock框架流行之前的一种方法)

这基本上就是您想要做的-伪造依赖项,在您的例子中,这恰好是C库。框架帮不上忙——您可能想尝试手动方法

创建一些简单、伪造的实现(非常像存根,例如,不管输入参数如何,只返回固定值——当然,可能比这更复杂),编译它,让它公开完全相同的头/函数,并在测试项目中引用它。这就是伪造(存根/模仿)背后的基本理念——一个对象假装成另一个对象


虽然听起来很简单,但我实际上并没有尝试过这一点——把它当作一个建议,作为你可以走哪条路。这种方法的局限性(除了在技术上是否可行)是非常差/没有配置选项(因为额外伪造的DLL会像硬编码的存根一样工作-配置文件可能会有所帮助,但这感觉…太多工作了?。

不幸的是,没有-这一部分更容易。我正在寻找一种方法来测试我的包装器,而不是使用我的包装器的代码。然后,您必须将包装器和本机dll添加到您的测试项目中,就像您必须将其添加到以后将使用它的所有应用程序中一样。我个人尽可能避免使用本机程序集。部署(自动)构建、错误的平台(x86与x64)以及在运行时使应用程序崩溃的缺少本机程序集的问题通常不值得费心。这始终是一个选项。如果像Cgreen这样的工具不能在我的环境中使用,我想我可以采用这种方法。@Bringer128:出于好奇,你打算如何在这里使用Cgreen?我看到它们提供了非常好的模拟实用程序,但这实际上只限于伪造DLL?或者我在这里遗漏了一些明显的东西?我很确定模仿DLL是唯一的方法。我得先做实验,找到什么东西后再报告。