C# · 12月 25, 2021

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

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

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

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

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