Javascript AngularJS模拟-使用jasmine进行单元测试的相同服务、不同功能
我正在尝试测试服务a,此服务具有以下功能: 申请代码:Javascript AngularJS模拟-使用jasmine进行单元测试的相同服务、不同功能,javascript,angularjs,unit-testing,jasmine,Javascript,Angularjs,Unit Testing,Jasmine,我正在尝试测试服务a,此服务具有以下功能: 申请代码: angular.module('app').factory('ServiceA', function() { var ServiceA = { _retryItem: null, retryItem: function(type, data) { ServiceA._retryItem = { type: type,
angular.module('app').factory('ServiceA', function() {
var ServiceA = {
_retryItem: null,
retryItem: function(type, data) {
ServiceA._retryItem = {
type: type,
data: data
};
return this;
},
clear: function() {
ServiceA._retryItem = null;
return this;
},
start: function(options, retryFn) {
ServiceA.clear();
ServiceA.retryItem('action', {url: '/my-url', options: options, retryFn: retryFn});
}
};
return ServiceA;
});
假设我想测试函数“start”,我有两个选项:
1) 调用实际函数清除并重试项:
...
describe('...', function() {
var options, retryFn;
beforeEach(function() {
options = {};
retryFn = function() {};
});
it('...', function() {
ServiceA.start(options, retryFn);
expect(ServiceA._retryItem).toEqual({type: 'action', data: {url: '/my-url', options: options, retryFn: retryFn});
});
});
...
describe('...', function() {
var options, retryFn;
beforeEach(function() {
options = {};
retryFn = function() {};
spyOn(ServiceA, 'clear');
spyOn(ServiceA, 'retryItem');
});
it('...', function() {
ServiceA.start(options, retryFn);
expect(ServiceA.clear).toHaveBeenCalled();
expect(ServiceA.retryItem).toHaveBeenCalledWith('action', {url: '/my-url', options: options, retryFn: retryFn});
});
});
2) 模拟清除和重试两个函数:
...
describe('...', function() {
var options, retryFn;
beforeEach(function() {
options = {};
retryFn = function() {};
});
it('...', function() {
ServiceA.start(options, retryFn);
expect(ServiceA._retryItem).toEqual({type: 'action', data: {url: '/my-url', options: options, retryFn: retryFn});
});
});
...
describe('...', function() {
var options, retryFn;
beforeEach(function() {
options = {};
retryFn = function() {};
spyOn(ServiceA, 'clear');
spyOn(ServiceA, 'retryItem');
});
it('...', function() {
ServiceA.start(options, retryFn);
expect(ServiceA.clear).toHaveBeenCalled();
expect(ServiceA.retryItem).toHaveBeenCalledWith('action', {url: '/my-url', options: options, retryFn: retryFn});
});
});
哪一个是正确的方法?我从单元测试中了解到的——我的单元是函数“启动”,我可以模拟并假设我有一个测试并且正在工作,对吗 我认为这取决于你想测试什么、你有多严格以及个人喜好。我会选择选项二,并在其他单元测试中分别测试其余的函数。通过这种方式,您不需要多次测试内容,并且可以得到某种文档,并且可以确定,这些关键函数是通过声音属性调用的。对我来说,这听起来真的很好!:) 我认为这取决于你想测试什么、你有多严格以及个人喜好。我会选择选项二,并在其他单元测试中分别测试其余的函数。通过这种方式,您不需要多次测试内容,并且可以得到某种文档,并且可以确定,这些关键函数是通过声音属性调用的。对我来说,这听起来真的很好!:) 我倾向于问我正在测试的函数在做什么。在这种情况下,start函数调用clear和retryItem。这些函数是实际执行工作的函数,start所做的就是确保调用这些函数。我建议您对start进行测试,只需检查是否调用了其他函数,然后专门为clear和retyItem编写测试 您可以检查是否使用spyOn调用了其他函数
spyOn(ServiceA, 'retryItem');
ServiceA.start(options, retryFn);
expect(ServiceA.retryItem).toHaveBeenCalled();
您还可以测试希望传入的参数是否已:
expect(ServiceA.retryItem).toHaveBeenCalledWith(['Expected Parameter']);
我倾向于问我正在测试的函数在做什么。在这种情况下,start函数调用clear和retryItem。这些函数是实际执行工作的函数,start所做的就是确保调用这些函数。我建议您对start进行测试,只需检查是否调用了其他函数,然后专门为clear和retyItem编写测试 您可以检查是否使用spyOn调用了其他函数
spyOn(ServiceA, 'retryItem');
ServiceA.start(options, retryFn);
expect(ServiceA.retryItem).toHaveBeenCalled();
您还可以测试希望传入的参数是否已:
expect(ServiceA.retryItem).toHaveBeenCalledWith(['Expected Parameter']);