2016-01-23 58 views
0

我試圖用QUnit在依賴服務中單元測試期望的javascript異常。如何使用QUnit測試javascript錯誤恢復

下面的塊是被測試的代碼。它是使用WinJS承諾的TypeScript。構造函數接受一個_dataLayer和_errorService作爲依賴關係。如果_dataLayer引發特定異常,則測試中的代碼將嘗試從錯誤中恢復。

module Services { 

    export class MyService { 

     constructor(private _dataLayer, private _errorService) { 
     } 

     private _items: any[]; 

     getItems() { 

      var promise = this._dataLayer.getItems() 
       .then((items) => { 
        this._items = items; 
        return this._items; 
       }) 
       .then(null, (error) => { 

        if (error.status === 404) { 
         // tolerate this error and recover 
         this._items = []; 
         return this._items; 
        } 

        // Display an error message 
        this._errorService.handleError(error); 

       }); 

      return promise; 

     } 
    } 
} 

以下單元測試嘗試證明待測代碼可以從預期異常中恢復。

QUnit.test("getItems handles _dataLayer.getItems HTTP 404", function (assert) { 

    // arrange 
    var done = assert.async(); 

    var _dataLayer = { 
     getItems: function() { 
      throw { status: 404 }; 
     } 
    }; 

    var svc = new Services.MyService(_dataLayer, null); 

    // act 
    svc.getItems().then(function (items) { 

     // assert 
     assert.strictEqual(items.length, 0); 
     done(); 

    }); 

}); 

下測試的代碼正確地從錯誤中恢復,我只是不能證明與QUnit。當測試運行時,看起來QUnit僅僅因爲拋出異常而無法通過測試,無論它如何處理。

我不測試是否引發錯誤。測試是爲了證明我們成功處理的拋出錯誤。

有沒有辦法構建QU​​nit測試,以便測試中的代碼將通過HTTP 404測試?

回答

0

Doh!我忽略了QUnit測試中的錯誤。它正在返回一個即時(錯誤)響應,並且它應該返回一個包含錯誤的承諾。

提示是QUnit不知道承諾的內部,事實上,一個錯誤從一個承諾內冒出來應該告訴我,QUnit根本不處理承諾!

以下修訂到QUnit測試正確地證明了該服務是從HTTP 404錯誤恢復:

QUnit.test("getItems handles _dataLayer.getItems HTTP 404", function (assert) { 

    // arrange 
    var done = assert.async(); 

    var _dataLayer = { 
     getItems: function() { 
      return WinJS.Promise.wrapError({ 
       status: 404 
      }); 
     } 
    }; 

    var svc = new Services.MyService(_dataLayer, null); 

    // act 
    svc.getItems().then(function (items) { 

     // assert 
     assert.strictEqual(items.length, 0); 
     done(); 

    }); 

});