簡體   English   中英

對某些類型的異常進行單元測試

[英]Unit Test for certain types of exceptions

在開始提問之前,請先了解一些背景知識。 我目前正在研究一個從IBM DB2遷移到SQL Server的項目。 不必太詳細,但是此DB2鏈接服務器有時會與SQL服務器斷開連接,這對於鏈接服務器是正常的。 我在代碼中進行此工作,並為此設置了一個流程來解決這個問題。

無論如何,我試圖編寫一個拋出DbException的測試方法(這是在未連接鏈接服務器時拋出的異常),以測試我在斷開鏈接服務器時編寫的過程。 有沒有一種方法可以強制拋出某種類型的異常,以便我可以測試我的代碼?

try catch塊如下所示:

try
{
    //Regular Processing and attempt to update to DB2
}
catch (DbException ex)
{
    //Other processing to catch a linked server issue
}
catch (Exception ex) 
{
    //Even more processing for other exceptions
}

這與大多數單元測試的方法相同,通過接口注入依賴項,將真正的db邏輯放在基於該接口的一個類中,並將測試內容放在基於該接口的另一個類中。

interface  IDBProcessor
{
   void Process()
}

class ThrowyClass : IDBProcessor
{
    public Exception ThrowThis {get; set;}
    public void Process() 
    {
        throw ThrowThis;
    }
}


void MyMethod(IDBProcessor processor)
{
  try
  {
    processor.Process()
  }
  catch (DbException ex)
  {
    //Other processing to catch a linked server issue
  }
  catch (Exception ex) 
  {
    //Even more processing for other exceptions
  }
}

然后在您的單元測試中,創建一個ThrowyClass並帶有所需的異常並將其傳遞給您。(如果需要,有些模擬框架可以使您免於創建Test類)。

[Test]
void MyThrowTest()
{
   var throwy = new ThrowyClass() { ThrowThis = new SomeSpecificException() };
   var myClass = new MyClass()
   myClass.MyMethod(throwy);
   // Assert what you expect
}

您將必須根據您的特定應用程序定制內容。 您可能希望將IProcessor注入“ MyClass”的構造函數中

您可以像這樣簡單地拋出它:

throw new DbException();

您應該看看IDbConnection並嘗試Moq框架
您的代碼應如下所示

var dbConnectionMock = new Mock<IDbConnection>();
dbConnectionMock.Setup(x => x.Open())
                   .Callback(() => {
                           throw new SqlException();
                       }).Verifiable();

https://github.com/Moq/moq4/wiki/Quickstart

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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