gpt4 book ai didi

unit-testing - Angular 单元测试 Controller - Controller 内的模拟服务

转载 作者:行者123 更新时间:2023-12-03 12:08:12 27 4
gpt4 key购买 nike

我有以下情况:

Controller .js

controller('PublishersCtrl',['$scope','APIService','$timeout', function($scope,APIService,$timeout) {

APIService.get_publisher_list().then(function(data){

});
}));

controllerSpec.js
'use strict';

describe('controllers', function(){
var scope, ctrl, timeout;
beforeEach(module('controllers'));
beforeEach(inject(function($rootScope, $controller) {
scope = $rootScope.$new(); // this is what you missed out
timeout = {};
controller = $controller('PublishersCtrl', {
$scope: scope,
APIService: APIService,
$timeout: timeout
});
}));

it('should have scope variable equals number', function() {
expect(scope.number).toBe(3);
});
});

错误:
 TypeError: Object #<Object> has no method 'get_publisher_list'

我也尝试过这样的事情,但没有奏效:
describe('controllers', function(){
var scope, ctrl, timeout,APIService;
beforeEach(module('controllers'));

beforeEach(module(function($provide) {
var service = {
get_publisher_list: function () {
return true;
}
};

$provide.value('APIService', service);
}));

beforeEach(inject(function($rootScope, $controller) {
scope = $rootScope.$new();
timeout = {};
controller = $controller('PublishersCtrl', {
$scope: scope,
APIService: APIService,
$timeout: timeout
}
);
}));

it('should have scope variable equals number', function() {
spyOn(service, 'APIService');
scope.get_publisher_list();
expect(scope.number).toBe(3);
});
});

我该如何解决这个问题?有什么建议么?

最佳答案

有两种方法(或更多肯定)。
想象一下这种服务(如果是工厂没关系):

app.service('foo', function() {
this.fn = function() {
return "Foo";
};
});
使用此 Controller :
app.controller('MainCtrl', function($scope, foo) {
$scope.bar = foo.fn();
});
一种方法是使用您将使用的方法创建一个对象并监视它们:
foo = {
fn: function() {}
};

spyOn(foo, 'fn').andReturn("Foo");
然后你通过 foo作为 Controller 的一个部门。无需注入(inject)服务。那可行。
另一种方法是模拟服务并注入(inject)模拟的服务:
beforeEach(module('app', function($provide) {
var foo = {
fn: function() {}
};

spyOn(foo, 'fn').andReturn('Foo');
$provide.value('foo', foo);
}));
当您注入(inject)时, foo它会注入(inject)这个。
在这里查看: http://plnkr.co/edit/WvUIrtqMDvy1nMtCYAfo?p=preview
Jasmine 2.0:
对于那些难以使答案起作用的人,
从 Jasmine 2.0 andReturn() 开始变成了 and.returnValue()因此,例如在上面 plunker 的第一个测试中:
describe('controller: MainCtrl', function() {
var ctrl, foo, $scope;

beforeEach(module('app'));

beforeEach(inject(function($rootScope, $controller) {
foo = {
fn: function() {}
};

spyOn(foo, 'fn').and.returnValue("Foo"); // <----------- HERE

$scope = $rootScope.$new();

ctrl = $controller('MainCtrl', {$scope: $scope , foo: foo });
}));

it('Should call foo fn', function() {
expect($scope.bar).toBe('Foo');
});

});
(来源: Rvandersteen)

关于unit-testing - Angular 单元测试 Controller - Controller 内的模拟服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20828179/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com