Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/444.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript AngularJS模拟-使用jasmine进行单元测试的相同服务、不同功能_Javascript_Angularjs_Unit Testing_Jasmine - Fatal编程技术网

Javascript AngularJS模拟-使用jasmine进行单元测试的相同服务、不同功能

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,

我正在尝试测试服务a,此服务具有以下功能:

申请代码:

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']);