是否可以对进行P / Invoke调用的类进行单元测试?

时间:2020-03-05 18:50:31  来源:igfitidea点击:

我想将使用Windows Impersonation API的代码包装到一个整洁的小帮助程序类中,并且像往常一样,我正在寻找一种方法以进行测试优先。但是,虽然WindowsIdentity是托管类,但advapi32.dll中的非托管函数实际上是作为另一个用户执行登录所需的LogonUser调用。

我想我可以通过为我的助手类引入一个接口来使用并隐藏实现中的P / Invoke调用来解决此问题,但是测试实现仍然是一个问题。我们可以想象在用户实际上需要在系统上存在的情况下,在测试中实际执行模拟可能会有些问题。

解决方案

回答

准则:不要测试尚未编写的代码。
我们不必担心WinAPI实现无法正常工作(很可能它可以按预期工作)。
我们应该关注的是测试"接线",即代码是否正确调用了WinAPI。在这种情况下,我们只需要模拟接口并让模拟框架告知我们是否使用正确的参数进行了调用。如果是,则完成。

  • 创建IWinAPIFacade(具有相关的WinAPI方法)并实现CWinAPIFacade。
  • 编写测试以插入IWinAPIFacade的模拟并验证是否进行了适当的调用
  • 编写测试以确保默认情况下已创建并插入CWinAPIFacade(在正常运行中)
  • 实现CWinAPIFacade,它只需对代理平台调用进行盲委托-无需自动测试该层。只需进行手动验证即可。希望这不会经常改变,并且不会中断。如果我们发现将来会使用,请通过一些测试将其设置为障碍。

回答

我不确定是否跟随我们。.我们不想自己测试PInvoke(我们没有编写它),所以想测试包装类是否按预期执行,对吗?

因此,只需在包装器类中创建接口并对此进行测试?

在需要设置用户等方面,我认为这是我们需要咬的子弹。模拟包装程序PInvoke调用似乎很奇怪,因为我们只需确认并存在接口即可:)