【问题标题】:How to mock SoapException using Moq to unit test error handling如何使用 Moq 模拟 SoapException 以对错误处理进行单元测试
【发布时间】:2014-02-14 09:13:55
【问题描述】:

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

问题:当我无法模拟接口并且无法将属性或方法设置为“虚拟”时,如何使用 Moq 模拟 SoapException 之类的类?

多一点解释:

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

我的单元测试代码的 sn-p:

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

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

由于我正在模拟一个具体类,并且 Actor 属性未标记为“虚拟”,因此在测试运行期间执行 SetupGet(...) 行时,Moq 会引发此异常:

System.NotSupportedException:非虚拟(在 VB 中可覆盖)成员上的设置无效:ex => ex.Actor

经过一番阅读,理想的答案是模拟一个界面,在这种情况下我无法做到这一点。由于这是一个嵌入到 .NET 框架中的类,我也不能神奇地将 Actor 属性标记为虚拟。

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

顺便说一句,我首先创建了一个实际的 SoapException,其中包含一些 XML 节点,但我很快就陷入了以编程方式创建 XML 文档树的兔子洞。我可以做到这一点,但它需要更多的测试设置代码行,如果可能的话我想避免。

【问题讨论】:

    标签: c# unit-testing soap error-handling moq


    【解决方案1】:

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

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

    shim 在运行时修改应用程序的编译代码,因此 它不是进行指定的方法调用,而是运行 shim 代码 您的测试提供的。垫片可用于替换调用 无法修改的程序集,例如 .NET 程序集。

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

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

    【讨论】:

    • 我要试试这个。谢谢。
    • 我刚刚发现 Microsoft Fakes 需要 Visual Studio 2012 或更高版本。我有 Visual Studio 2010,但我也发现 Microsoft Moles Framework 是 Fakes 的前身。我将尝试这样做,但我将此问题标记为答案,因为它是最新的答案。我还将发布我自己对 Visual Studio 2010 的答案。
    【解决方案2】:

    我在模拟 SoapException 时遇到了同样的情况。我使用了 SoapException 的构造函数来传递 Detail、Actor 等。下面是使用 Rhino Mocks。

    //Build your xmlDocument 
        SoapException mockSoapException = MockRepository.GenerateMock<SoapException>("Mock SoapException", new XmlQualifiedName(), "TEST", xmlDocument); 
    

    【讨论】:

    • 这可行,但我不想手动构建 XML 文档。
    猜你喜欢
    • 2023-03-29
    • 1970-01-01
    • 2013-07-08
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    • 1970-01-01
    • 2011-01-30
    • 1970-01-01
    相关资源
    最近更新 更多