有以下角度控制器我如何嘲笑的角度服务的功能茉莉花
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没有定义。
wtm是一个全局对象,当我运行我的测试时,它是不会被定义的,因为当我运行我的测试时,它所声明的代码没有运行。我想知道的是为什么真正的$ http.get函数被调用,我如何设置一个间谍或存根,以便我实际上不调用真正的函数?
(inb4恨在全局:我的同事之一一直负责保理那些了我们的代码:))
,我想原因是因为我无法预测的时间提前什么网址将被传递给GET()。我想要做一些类似 $ httpBackend.when('GET','*')。respond({}); 但我猜这个*在上下文中不起作用,因为我仍然得到相同的ReferenceError:wtm没有定义。 – akronymn
现在我想到了这一点,不管我告诉GET的期望是什么路径。当它运行我的控制器代码时,它将尝试解析该wtm变量。除非有人嘲笑GET函数,否则它实际上会忽略在代码中传递给它的参数,所以在实际测试此控制器之前,我将不得不重构该全局wtm varibale。 – akronymn
其实它现在看起来像我可以使用你建议的whenGET函数,blesh,现在声明并在我的测试范围内定义wtm。 – akronymn