2015-05-27 80 views
1

我有一個AngularJS項目,它使用Karma在瀏覽器中運行一些單元測試。我使用摩卡作爲測試框架。但是,我有一些規範測試需要閱讀一些JSON文件,並檢查它們是否遵守給定的約定規範(類型,名稱約定等)。

我應該說清楚它是我想測試的這些文件的實際內容。不是通過Angular Mock的$httpBackend他們的欺騙版本。

我正在標記用於karma.conf.js服務的JSON文件。

files: [ 
    { pattern: 'static/assets/json/cards/*.json', included: false, served: true }, 
    'path/to/angular.js', 
    'path/to/angular-mocks.js', 
    'tests/**/*.js' 
] 

如果我跑karma start,我可以瀏覽到/base/static/assets/json/cards/something.json並看到文件被提供。

接下來,在我的測試中,$http$q服務都被注入。

var $http, $q; 

beforeEach(module('chai')); 
beforeEach(inject(function(_$http_, _$q_) { 
    $http = _$http_; 
    $q = _$q_; 
})); 

然後我嘗試使用$http.get加載每個資源。最後,從$http.get返回的承諾進行整理,並致電$q.all以便等待它們全部完成,然後致電done()並繼續前進。

it('should load the resources', function(done) { 
    var promises = ['admissions.json', 'discharge.json'] 
    .map(function(resource) { 
    console.log('Loading', resource); 
    return $http.get('/base/static/assets/json/cards/' + resource); 
    }); 

    $q.all(promises) 
    .then(function(card) { 
    console.log('Success'); 
    done(); 
    }, function(err) { 
    console.log('Failure', err); 
    done(); 
    }); 
}); 

當我的測試運行,我看到下面的控制檯輸出:

Loading admissions.json 
Loading discharge.json 
Error: timeout of 2000ms exceeded. Ensure the done() callback is being called in this test. 

起初我認爲它可能已被超過的花費很長的時間來加載超時,但該文件只95KB。

接下來,我想知道對於$http自定義承諾接口(.success.error)是否被打破$q.all方法。但顯然不是。

最後,我試着在所有測試開始時對/base/static/assets/json/cards/admissions.json做出獨立請求。

它按照預期返回一個承諾,但它永遠不會被解決,因爲沒有響應被髮回。我查看了網絡工具,看看會發生什麼事情,事實證明,這個請求甚至不在首位。代碼肯定會運行,但由於某種原因$http實際上並未提出請求。

我的意見是,這是與角度模擬攔截$http請求它自己的$httpBackend服務。我怎樣才能繞過這個?

回答

0

我在this blog找到了解決方案。問題在於您必須添加範圍的摘要,即使您不測試控制器。

it('does a thing one way', function() { 
    var value; 
    deferred.promise.then(function(_value_) { 
     value = _value_; 
    }); 
    deferred.resolve(10); 
    expect(value).not. toBe(10); // not yet 10 because $digest hasn't run 
    $scope.$digest(); 
    expect(value).toBe(10); // 10 because $digest already ran 
});