期望在非常简单的服务上调用函数

时间:2015-11-24 19:50:59

标签: angularjs karma-runner

我提供了一项非常简单的服务,以便在测试时检查我的理智。这是:

(function() {
    'use strict';
    angular
        .module('app')
        .service('TestService', TestService);

    function TestService() {
        function foo() {
            bar();
        }
        function bar() {
            console.log('Hello world!');
        }
        return {
            foo: foo,
            bar: bar
        };
    }
}());

所以这里没什么复杂的 - foo()调用bar(),它输出一个简单的“Hello World'消息到控制台。我对此的测试看起来像这样:

(function() {
    'use strict';
    fdescribe('test.service',function() {
        var testService;
        beforeEach(module('app'));
        beforeEach(inject(function(_TestService_) {
            testService = _TestService_;
        })); 

        describe('setup',function() {
            it('should get the testService',function() {
                expect(testService).not.toBe(undefined);
            });
        });
        describe('foo()',function() {
            fit('should call bar',function() {
                spyOn(testService,'bar');
                testService.foo();
                expect(testService.bar).toHaveBeenCalled();
            });
        });
    });
}());

我在这里所做的就是通过常规方法查看foo调用栏,即监视吧。但这给了我错误:

Expected spy bar to have been called

我拉着我的头发试图弄清楚这一点,因为这不是一件复杂的事情 - 我从根本上做错了什么?

谢谢!

1 个答案:

答案 0 :(得分:1)

我想我知道问题是什么。 当您监视testService, 'bar'时,jasmine将使用间谍替换testService上的“bar”属性,但是在内部,您的服务foo()没有引用testService对象,因此因此它永远不能称之为间谍。

试试这个:

(function() {
    'use strict';
    angular
        .module('app')
        .service('TestService', TestService);

    function TestService() {
        var service = {};
        service.foo = function() {
            service.bar();
        };
        service.bar = function() {
            console.log('Hello world!');
        };
        return service;
    }
}());