【问题标题】:Is it possible to unit test a class that makes P/Invoke calls?是否可以对进行 P/Invoke 调用的类进行单元测试?
【发布时间】:2010-09-08 09:09:07
【问题描述】:

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

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

【问题讨论】:

    标签: c# unit-testing unmanaged impersonation


    【解决方案1】:

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

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

    【讨论】:

    • 这是我采用的方法,我对此很满意。但是,我仍然希望有一种方法可以验证我的具体类在调用 Win32 api 时是否“做正确的事”。 :)
    • 有。这称为集成测试。
    • @nathanchere - +1ed。只需确保将其作为某些系统级测试(手动/验收)的一部分进行覆盖。因此,即使是“CWinAPIFacade 已损坏”的边缘情况也会被尽早发现(自动化当然是理想的)。
    • 我正在尝试遵循这种方法,并且我了解它如何用于函数(例如返回错误代码)。但我不明白这将如何用于 WinAPI 调用(例如创建和返回 Windows 内部结构)。 'm_hSession = SnmpCreateSession(NULL, 0, callback, this);'此调用创建 HSNMP_SESSION 结构,然后用于其他 WinAPI 调用。
    【解决方案2】:

    我不确定我是否关注您。您不想自己测试 PInvoke(不是您编写的),所以您想测试包装类是否按预期执行,对吗?

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

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

    【讨论】:

      猜你喜欢
      • 2017-09-27
      • 1970-01-01
      • 1970-01-01
      • 2011-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-18
      • 1970-01-01
      相关资源
      最近更新 更多