c# - 单元测试 WCF 错误

标签 c# wcf unit-testing faultexception wcf-faults

对 WCF 服务的预期故障进行单元测试的最佳方法是什么?

我正在尝试对 WCF 服务进行单元测试,该服务(正确地)针对某个可重现的错误抛出 FaultExceptions。单元测试获取 WCF 客户端的实例并调用适用的服务方法,该方法会引发 FaultException。

所有这些都按您预期的那样工作,但我很难对此进行单元测试,因为当错误未在服务实现中捕获时,故障会导致 IDE 中断。因为我使用的是故障而不是异常,所以我希望 IDE 序列化异常并将其发送到客户端,它会在客户端引发异常。

我确实看到有一个配置选项可以为特定的用户未处理的异常禁用中断,但我希望有人能指出一种更好的方法来实现相同的结果,因为这在团队环境中不容易做到.

这里有一些示例代码,展示了当前实现的样子......

单元测试项目有一个对我的 WCF 服务的服务引用,我已经这样定义了接口(interface):

[OperationContract(Name = "DoSomething")]
[FaultContract(typeof(EpicFail))]
ResponseObject DoSomething(RequestObject requestObject);

故障定义如下:

[DataContract]
public class EpicFail
{

    public EpicFail(string action)
    {
        this.Reason = "Epic Fail";
        this.Action = action;
    }

    [DataMember]
    public string Reason
    {
        get;
        set;
    }

    [DataMember]
    public string Action
    {
        get;
        set;
    }

}

调用该服务的代码大致如下所示:

[TestMethod()]
[ExpectedException(typeof(FaultException<EpicFail>))]
public void FaultTest_Fails_Epicly()
{
    bool testPassed = false;

    try
    {
        ResponseObject resp = GetServiceClient().DoSomething(req);
    }
    catch (FaultException<EpicFail>)
    {
        testPassed = true;
    }

    Assert.IsTrue(testPassed);
}
  • 我编辑了代码以显示我正在使用 ExpectedException 属性,它似乎对防止 IDE/调试器在服务中抛出异常时中断没有太大影响。

最佳答案

您始终可以使用 ExpectedExceptionAttribute(在 NUnit 中)来确保这是抛出的异常。 MSTest 也有类似的概念。

[ExpectedException(typeof(MyException))]
void my_test()
{
     // test
}

如果你有一些 Mock 验证要做,我会使用 try/catch block 并在 catch 中验证然后抛出异常。

更新

当您使用 ExpectedException 属性时,您不应该捕获异常,相反您需要让运行测试的 NUnit 捕获它。

如果你需要验证异常中的特殊信息那么你捕获异常,验证信息然后重新抛出:

[ExpectedException(typeof(MyException))]
void my_test()
{
     try
     {
         // call the service
     }
     catch(MyException ex)
     {
          Assert.IsTrue(ex.Message.Contains("error code 200"));
          throw ex;
     }

}

关于c# - 单元测试 WCF 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4071143/

相关文章:

c# - Silverlight {Binding} 不会访问类成员

c# - 通过 C# 和 SMO 检查和删除现有表

c# - Xamarin.Forms.UWP - 错误 PRI175

c# - 多个用户的 WCF 身份验证自定义用户名和密码验证器

c# - 仅实现 Json 和 https 的 Wcf 服务

c# - 有没有一种简单的方法可以在 C# 中使用内存存储来支持 OData 搜索?

c# - 如何在 ASP.NET 中命令页面重新加载?

c# - 我正在尝试设置通过 MsmqIntegrationBinding 调用的 WCF 服务,但出现错误

python - 你能用我的具体例子解释测试驱动开发吗?

java - powermock 有序