gpt4 book ai didi

c# - 如何使用 Moq 模拟 SoapException 以单元测试错误处理

转载 作者:行者123 更新时间:2023-11-30 12:28:33 25 4
gpt4 key购买 nike

我继承了一个可以调用 SOAP 网络服务的小型控制台应用程序。以各种方式记录异常的嵌套 try-catch 是一团悲剧,我想围绕它在抛出 SoapException 时的行为进行一些测试。

问题:当我不能模拟接口(interface)并且不能使属性或方法“虚拟”时,我如何使用 Moq 模拟像 SoapException 这样的类?

更多的解释:

为了测试这个错误处理,我需要控制 SoapException 对象的 Actor 属性,以及 Detail 属性以验证错误处理。

我的单元测试代码片段:

[TestMethod]
public void MyTestMethod()
{
Mock<SoapException> soapMock = new Mock<SoapException>(MockBehavior.Strict);

soapMock.SetupGet<string>(ex => ex.Actor).Returns("Test Actor");

因为我正在模拟一个具体的类,并且 Actor 属性没有标记为“Virtual”,Moq 在执行 SetupGet(...) 时抛出这个异常> 测试运行期间的行:

System.NotSupportedException: Invalid setup on a non-virtual (overridable in VB) member: ex => ex.Actor

经过一些阅读,理想的答案是模拟一个接口(interface),在这种情况下我无法做到这一点。由于这是 .NET 框架中的一个类,我也无法神奇地将 Actor 属性标记为虚拟。

我如何模拟 SoapException,或者是否有其他方法可以验证错误处理?

顺便说一句,我首先着手创建一个实际的 SoapException,其中包含一些 XML 节点,但我很快就陷入了以编程方式创建 XML 文档树的困境。我可以做到,但它需要更多行测试设置代码,我希望尽可能避免。

最佳答案

无法使用 Moq 模拟它。一种选择是使用 Microsoft Fakes Framework 中的 Shim。您可以在您尝试模拟的代码不使用接口(interface)或者是虚拟方法(如您的场景)的场景中使用它。

请参阅以下来自 msdn 的 Shim 说明。

A shim modifies the compiled code of your application at run time so that instead of making a specified method call, it runs the shim code that your test provides. Shims can be used to replace calls to assemblies that you cannot modify, such .NET assemblies.

http://msdn.microsoft.com/en-us/library/hh549175.aspx

请注意,Fakes 框架仅适用于 Visual Studio Ultimate 或 Premium。

关于c# - 如何使用 Moq 模拟 SoapException 以单元测试错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21314672/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com