次の角度コントローラーがあります
function IndexCtrl($scope, $http, $cookies) {
//get list of resources
$http.get(wtm.apiServer + '/v1/developers/me?access_token=' + $cookies['wtmdevsid']).
success(function(data, status, headers, config) {
// snip
}).
error(function(data, status, headers, config) {
// snip
});
$scope.modal = function() {
// snip
}
return;
}
私がやろうとしているのは、$http サービスの get メソッドをモックすることです。これが私の単体テストコードです:
describe('A first test suite', function(){
it("A trivial test", function() {
expect(true).toBe(true);
});
});
describe('Apps', function(){
describe('IndexCtrl', function(){
var scope, ctrl, $httpBackend;
var scope, http, cookies = {wtmdevsid:0};
beforeEach(inject(function($injector, $rootScope, $controller, $http) {
scope = $rootScope.$new();
ctrl = new $controller('IndexCtrl', {$scope: scope, $http: $http, $cookies: cookies});
spyOn($http, 'get');
spyOn(scope, 'modal');
}));
it('should create IndexCtrl', function() {
var quux = scope.modal();
expect(scope.modal).toHaveBeenCalled();
expect($http.get).toHaveBeenCalled();
});
});
});
これを実行すると、ReferenceError: wtm is not defined が発生します。
wtm はグローバル オブジェクトであり、もちろん、テストを実行するときに定義されません。なぜなら、wtm で宣言されているコードは、テストを実行するときに実行されないからです。私が知りたいのは、実際の $http.get 関数が呼び出される理由と、実際に実際の関数を呼び出さないようにスパイまたはスタブを設定する方法です。
(グローバルに対する inb4 嫌悪: 私の同僚の 1 人が、私たちのコードからそれらを因数分解する任務を負っています :) )