[英]Unit testing WCF Faults
從WCF服務單元測試預期故障的最佳方法是什么?
我正在嘗試對WCF服務進行單元測試,該服務(正確地)拋出FaultExceptions以獲得某個可重現的錯誤。 單元測試獲取WCF客戶端的實例並調用適用的服務方法,該方法拋出FaultException。
所有這些都可以按照您的預期運行,但是我對單元測試很困難,因為當服務實現中沒有捕獲到錯誤時,錯誤會導致IDE崩潰。 因為我使用的是故障而不是異常,所以我希望IDE能夠序列化異常並將其發送到客戶端,在那里它會引發異常。
我確實看到有一個配置選項來禁用特定用戶未處理異常的中斷,但我希望有人可以指出一種更好的方法來實現相同的結果,因為這在團隊環境中不容易實現。
下面是一些示例代碼,介紹了當前實現的內容......
單元測試項目有一個對我的WCF服務的服務引用,我已經定義了這樣的接口:
[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);
}
您始終可以使用ExpectedExceptionAttribute
(在NUnit中)來確保拋出此異常。 MSTest也有類似的概念。
[ExpectedException(typeof(MyException))]
void my_test()
{
// test
}
如果你要做一些Mock驗證,我會使用try / catch塊並在catch中驗證然后拋出異常。
UPDATE
當您使用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;
}
}
mattv,
為什么此測試必須遠程訪問服務? 從我看到你的代碼:
ResponseObject resp = GetServiceClient().DoSomething(req);
以某種方式獲得服務客戶端,而不是服務實例本身。 我建議直接測試服務具體類進行單元測試。
但是,如果您需要此方案,您是否嘗試過不捕獲異常並運行測試? 它會給出相同的結果嗎?
順便說一句,如果你需要捕獲並重新使用以下模式:
try {
//Do something
}
catch(SomeException e) {
//Do something with e
throw
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.