Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否可以对进行P/Invoke调用的类进行单元测试?_C#_Unit Testing_Unmanaged_Impersonation - Fatal编程技术网

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

C# 是否可以对进行P/Invoke调用的类进行单元测试?,c#,unit-testing,unmanaged,impersonation,C#,Unit Testing,Unmanaged,Impersonation,我想将一段使用Windows模拟API的代码包装成一个整洁的小助手类,像往常一样,我正在寻找一种先进行测试的方法。但是,虽然WindowsIdentity是一个托管类,但作为另一个用户实际执行登录所需的LogonUser调用是advapi32.dll中的非托管函数 我想我可以通过为我的助手类引入一个接口来解决这个问题,并在实现中隐藏p/Invoke调用,但是测试该实现仍然是一个问题。您可以想象,在测试中实际执行模拟可能有点问题,因为用户实际上需要存在于系统中。准则:不要测试您尚未编写的代码。 您

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

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

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

  • 创建IWinAPIFacade(使用相关的WinAPI方法)并实现CWinAPIFacade
  • 编写一个测试,插入IWinAPIFacade的模拟,并验证是否进行了适当的调用
  • 编写一个测试,以确保创建CWinAPIFacade并将其作为默认值插入(正常运行)
  • 实现CWinAPIFacade,它只会使委托对平台调用盲显,无需自动测试该层。只是做一个手工验证。希望这种情况不会经常改变,不会有任何问题。如果你发现它将来会这样做,用一些测试来阻止它

    • 我不确定我是否听懂了你的话。。您不想自己测试PInvoke(您没有编写它),所以您想测试包装器类是否按预期运行,对吗

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


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

      这是我采用的方法,我对此相当满意。但是,我仍然希望有一种方法可以验证我的具体类在调用Win32 api时是否“做了正确的事情”:有。这叫做集成测试。@nathanchere-+1ed。只需确保它是某些系统级测试(手动/验收)的一部分。因此,即使是边缘案例“CWinAPIFacade is breaked”也很早就被发现了(自动化当然是理想的)。我正试图遵循这种方法,并且我了解它如何适用于返回错误代码的函数。但我不明白这对WinAPI调用(例如创建并返回windows内部结构)如何起作用m_hSession=SnmpCreateSession(NULL,0,回调,this);'此调用创建HSNMP_会话结构,然后在其他WinAPI调用中使用该结构。