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

时间:2008-09-10 04:55:22

标签: c# unit-testing unmanaged impersonation

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

我认为我可以通过为我的帮助类引入一个接口来解决这个问题,以便在实现中使用和隐藏P / Invoke调用,但测试该实现仍然是个问题。你可以想象,实际在测试中进行模拟可能会有点问题,因为用户实际上需要在系统上存在。

2 个答案:

答案 0 :(得分:12)

指南:不要测试你没有写过的代码。
您不应该担心WinAPI实现不起作用(很可能它按预期工作)。 您应关注的是测试“接线”,即您的代码是否进行了正确的WinAPI呼叫。在这种情况下,您只需要模拟界面并让模拟框架告诉您调用是否使用了正确的参数。如果是的话,你已经完成了。

  • 创建IWinAPIFacade(使用相关的WinAPI方法)并实现CWinAPIFacade。
  • 编写一个插入IWinAPIFacade模拟的测试并验证是否进行了适当的调用
  • 编写测试以确保创建CWinAPIFacade并将其作为默认设置插入(正常运行)
  • 实现CWinAPIFacade,它只是盲目委托给Platform Invoke调用 - 无需自动测试该层。只需进行手动验证即可。希望这不会经常改变,没有任何破坏。如果您将来发现它 ,请通过一些测试来阻止它。

答案 1 :(得分:0)

我不确定我是否关注你..你不想自己测试PInvoke(你没有写它)所以你想测试包装类是否正常运行?

那么,只需在包装器类中创建你的接口并对其进行测试吗?

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