2016-01-23 29 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(); 

    }); 

});