mat*_*ttv 9 c# wcf unit-testing wcf-faults faultexception
从WCF服务单元测试预期故障的最佳方法是什么?
我正在尝试对WCF服务进行单元测试,该服务(正确地)抛出FaultExceptions以获得某个可重现的错误.单元测试获取WCF客户端的实例并调用适用的服务方法,该方法抛出FaultException.
所有这些都可以按照您的预期运行,但是我对单元测试很困难,因为当服务实现中没有捕获到错误时,错误会导致IDE崩溃.因为我使用的是故障而不是异常,所以我希望IDE能够序列化异常并将其发送到客户端,在那里它会引发异常.
我确实看到有一个配置选项来禁用特定用户未处理异常的中断,但我希望有人能指出一种更好的方法来实现相同的结果,因为这在团队环境中不容易实现.
下面是一些示例代码,介绍了当前实现的内容......
单元测试项目有一个对我的WCF服务的服务引用,我已经定义了这样的接口:
[OperationContract(Name = "DoSomething")]
[FaultContract(typeof(EpicFail))]
ResponseObject DoSomething(RequestObject requestObject);
Run Code Online (Sandbox Code Playgroud)
故障定义如下:
[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;
}
}
Run Code Online (Sandbox Code Playgroud)
调用该服务的代码看起来像这样:
[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);
}
Run Code Online (Sandbox Code Playgroud)
您始终可以使用ExpectedExceptionAttribute
(在 NUnit 中)来确保这是抛出的异常。MSTest 也有类似的概念。
[ExpectedException(typeof(MyException))]
void my_test()
{
// test
}
Run Code Online (Sandbox Code Playgroud)
如果您需要进行一些模拟验证,我将使用 try/catch 块并在 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;
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4643 次 |
最近记录: |