簡體   English   中英

單元測試WCF故障

[英]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);
}
  • 我編輯了代碼以顯示我正在使用ExpectedException屬性,並且當在服務中拋出異常時,它似乎沒有對保持IDE / Debugger中斷有太大影響。

您始終可以使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM