簡體   English   中英

為什么我在Jasmine 1.3.x中的AngularJS異步測試無法正常工作?

[英]Why my AngularJS async test in Jasmine 1.3.x is not working?

嗨,我有一個使用AngularJS(1.5.11)編寫的功能完整的Web應用程序,現在我開始使用karma(0.12.37),grunt-karma(0.8.3),karm-chrome-launcher( 0.1.12),karma-phantomjs-launcher(1.0.4), phantomjs-prebuilt (2.1.14),茉莉花承諾匹配器(2.3.0)和karma-jasmine(0.1.6),以及1.3.x茉莉花版本。

我對測試異步內容不是很有信心,所以我開始四處搜尋,最終總是看到運行AngularJS異步測試的唯一強制性要求是$rootScope/$scope.$apply/$digest被稱為。

最終我發現有人建議我使用runs()和waitsFor() ,尤其是在使用chrome-launcher時,此plunkr中的測試可以順利運行,但是在使用phantomjs-launcher時失敗,並拋出如下錯誤:

Expected { myError : { error : 'error_message' }, line : <factory's line of code which throws the error>, sourceURL : 'path/to/factory.js', stack :

     <function throwing error> B@path/to/factory.js:<factory's line of code which throws the error>
     <"async" function> A@path/to/factory.js:<factory's line of code which calls B()>
     path/to/factory-spec.js:<the following line of code: var promise = HandleService.A();>
     invoke@path/to/angular/angular.js:4771:24
     WorkFn@path/to/angular-mocks/angular-mocks.js:3130:26
     execute@path/to/node_modules/karma-jasmine/lib/jasmine.js:1145:22
     next_@path/to/node_modules/karma-jasmine/lib/jasmine.js:2177:38
     start@path/to/node_modules/karma-jasmine/lib/jasmine.js:2130:13
     execute@path/to/node_modules/karma-jasmine/lib/jasmine.js:2458:19
     next_@path/to/node_modules/karma-jasmine/lib/jasmine.js:2177:38
     start@path/to/node_modules/karma-jasmine/lib/jasmine.js:2130:13
     execute@path/to/node_modules/karma-jasmine/lib/jasmine.js:2604:19
     next_@path/to/node_modules/karma-jasmine/lib/jasmine.js:2177:38
     start@path/to/node_modules/karma-jasmine/lib/jasmine.js:2130:13
     execute@path/to/node_modules/karma-jasmine/lib/jasmine.js:2604:19
     next_@path/to/node_modules/karma-jasmine/lib/jasmine.js:2177:38
     onComplete@path/to/node_modules/karma-jasmine/lib/jasmine.js:2173:23
     finish@path/to/node_modules/karma-jasmine/lib/jasmine.js:2561:15
     path/to/node_modules/karma-jasmine/lib/jasmine.js:2605:16

     next_@path/to/node_modules/karma-jasmine/lib/jasmine.js:2187:24
     onComplete@path/to/node_modules/karma-jasmine/lib/jasmine.js:2173:23
     finish@path/to/node_modules/karma-jasmine/lib/jasmine.js:2561:15
     path/to/node_modules/karma-jasmine/lib/jasmine.js:2605:16

     next_@path/to/node_modules/karma-jasmine/lib/jasmine.js:2187:24
     onComplete@path/to/node_modules/karma-jasmine/lib/jasmine.js:2173:23
     finish@path/to/node_modules/karma-jasmine/lib/jasmine.js:2432:15
     path/to/node_modules/karma-jasmine/lib/jasmine.js:2459:16

     next_@path/to/node_modules/karma-jasmine/lib/jasmine.js:2187:24
     path/to/node_modules/karma-jasmine/lib/jasmine.js:2167:23' }, pending : undefined, processScheduled : false } } to be rejected with { myError : { error : 'error_message' } }.

因此,我開始認為Chrome的結果為假陽性,因此我需要重寫異步測試:因此,我嘗試使用類似plunkr的方法進行嘗試 ,但是現在PhantomJs和Chrome中的測試均失敗,並顯示預期的超時消息:

timeout: timed out after 1500 msec waiting for A should catch an error

注意: 我現在無法將Jasmine更新到2.0版並使用done參數機制 ,如果正確使用,我什$rootScope.$apply/$digest不應該在使用jasmine-promise-matchers時手動觸發$rootScope.$apply/$digest

對於這種捕獲自定義錯誤和異步函數的異步函數,如何正確編寫我的異步測試?

角“異步”測試一般是同步的,從而waitsForruns是不必要的和有害的明顯。

的確, jasmine-promise-matchers不需要手動觸發摘要來執行$ q promises,因為這是在內部完成的。

這里的問題是比賽條件。 第一次runs似乎在$rootScope.$digest()之后運行,並且catch塊從不執行-第二次runs也是如此。

相反,應該對其進行同步測試:

  it('it actually throws an error, yay', function () {
    var promise = HandleService.A();

    expect(promise).toBePromise();
    expect(promise).toBeRejectedWith(jasmine.objectContaining({
      myError: {error: 'error_message'}
    }));
  });

暫無
暫無

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

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