Jasmine:模拟 Bower 库

Jasmine: mocking Bower library

我正在尝试创建一个模拟来测试依赖于 Bower 管理的另一个服务的服务。 Jasmine 测试的代码如下(完整示例位于 plunker):

describe('jsonrpc', function() {
    'use strict';

    var uuidMock, $httpBackend, jsonrpc;

    beforeEach(module('jsonrpc', function ($provide) {
        uuidMock = {};
        uuidMock.generate = function () { return 0; };
        $provide.value('uuid', uuidMock);
    }));

    beforeEach(inject(function(_jsonrpc_, _$httpBackend_) {
        jsonrpc = _jsonrpc_;
        $httpBackend = _$httpBackend_;
    }));

    it('should have created $httpBackend', function() {
        expect($httpBackend.get).toBeDefined();
    });

});

'jsonrpc'服务提供者定义如下:

angular.module('jsonrpc', ['uuid']).provider('jsonrpc', function() {
    'use strict';

    var defaults = this.defaults = {};
    defaults.basePath = '/rpc';

    this.$get = ['$http', 'uuid4', function($http, uuid4) {
        function jsonrpc(options, config) {

        ... (etc) ...

当我尝试模拟 'jsonrpc' 模块对 'uuid' 模块的依赖时,出现以下错误:

$injector:modulerr http://errors.angularjs.org/1.2.16/$injector/modulerr?p0=jsonrpc&p1=%5B%24injector%3Amodulerr%5D%20http%3A%2F%2Ferrors.angularjs.org%2F1.2.16%2F%24injector%2Fmodulerr%3Fp0%3Duuid%26p1%3D%255B%2524injector%253Anomod

在模拟该依赖项时,我做错了什么?

你这样做是不对的,因为你修改的是 jsrpc 模块的提供者,而不是 uuid 模块,你只是调用 $provide.value 来提供应该是整个模块的内容(不是一个值)

如果 uuid4 是您需要模拟的 uuid 的唯一部分,您可以这样做

module('jsrpc', function($provide) {
    $provide.service('uuid4', uuid4Mock)
});

其中 uuid4Mock 仅提供该服务的行为,或其中的任何内容。