我正在尝试测试角度服务在初始化时响应它从另一个服务获得的值的方式,并且我很难找到一种不笨拙的方法......更不用说一种有效的方法了。
我正在尝试测试的服务看起来像这样:
angular.module('myApp')
.service('myService', function (Auth, DataGrabber) {
var self = this;
this.initialize = function () {
this.user = Auth.getUser();
if (!this.user.name) {
DataGrabber.grabName();
}
if (!this.user.birthday) {
DataGrabber.grabBirthday();
}
}
this.initialize();
})
这是我试图测试它的不太顺利的方式:
describe('myService', function () {
var myService;
var dataGrabberMock;
var authMock;
var grabbedName;
var grabbedBirthday;
beforeEach(function () {
module('myApp')
})
beforeEach(function() {
grabbedName = false;
grabbedBirthday = false;
authMock = {
getUser: function () {
return {
name: 'Bob',
birthday: 'Feb 22'
}
}
}
dataGrabberMock = {
grabName: function () {
grabbedName = true;
},
grabBirthday: function () {
grabbedBirthday = true;
}
}
module(function ($provide) {
$provide.value('Auth', authMock);
$provide.value('DataGrabber', dataGrabberMock);
})
})
it ('just gets info if all data is present', function () {
inject(function($injector) {
myService = $injector.get('myService');
expect(myService.user.name).toBe('Bob');
expect(myService.user.birthday).toBe('Feb 22');
});
});
it ('gets info if name is missing', function () {
// how do I stub the new user response here?
})
it ('calls birthdayGetter if birthday is missing', function () {
// here too?
})
})
更改 authMock 为每个测试提供的值的最简洁方法是什么?
我已经尝试过无数种不同的inject()、$injector、$provide 和spyOn() 组合。我终于通过设置存根和间谍并在测试中显式调用 myService.initialize() 来让它工作,但是初始化代码为每个测试运行两次,感觉不对。
我是角度测试的新手,所以作为一个新手,我肯定会忽略一种更好的方法。
谢谢!