2008-09-10 90 views
5

我想将一段使用Windows Impersonation API的代码封装到一个整洁的小帮手类中,并且和往常一样,我正在寻找一种先行先试的方法。但是,虽然WindowsIdentity是托管类,但实际上以另一个用户身份登录所需的LogonUser调用是advapi32.dll中的非托管函数。单元测试是否可以进行P/Invoke调用?

我想我可以通过引入一个接口让我的帮助类在实现中使用和隐藏P/Invoke调用,但测试该实现仍然是一个问题。你可以想象,考虑到用户实际上需要存在于系统中,实际上在测试中执行模拟可能有点问题。

回答

10

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

  • 创建IWinAPIFacade(具有相关的WinAPI方法)和实现CWinAPIFacade。
  • 写测试该塞在IWinAPIFacade的模拟和验证相应呼叫是由
  • 写测试,以确保CWinAPIFacade被创建并插入作为默认(在正常运转)
  • 实施CWinAPIFacade其只是盲目委托给Platform Invoke调用 - 不需要自动测试这个层。只需进行手动验证。希望这不会经常改变,也不会有任何突破。如果你在将来发现确实是,那就用一些测试来封锁它。
+0

这是我采用的方法,我对它很满意。但是,我仍然希望有一种方法来验证我的具体类在调用Win32 API时是否“做正确的事情”。 :) – Rytmis 2008-10-31 11:24:08

+1

有。这就是所谓的集成测试。 – nathanchere 2014-04-02 01:01:47

0

我不确定我是否按照你..你不想自己测试PInvoke(你没有写它),所以你想测试包装类是否按预期执行正确?

那么,只需在包装类中创建接口并进行测试呢?

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

相关问题