Javascript Angularjs测试返回静态数据的简单工厂

Javascript Angularjs测试返回静态数据的简单工厂,javascript,angularjs,jasmine,karma-runner,Javascript,Angularjs,Jasmine,Karma Runner,如何在AngularJs中模拟一个简单的工厂,在Karma单元测试中返回静态数据 我有一个简单的工厂,为了示例,它返回静态数据: angular.module('conciergeApp.services') .factory('CurrentUser', function() { return { id: 1, hotel_id: 1, } }); 我想知道如何为此编写Karma测试 到

如何在AngularJs中模拟一个简单的工厂,在
Karma
单元测试中返回静态数据

我有一个简单的工厂,为了示例,它返回静态数据:

angular.module('conciergeApp.services')
       .factory('CurrentUser', function() {
        return {
            id: 1,
            hotel_id: 1,
        }
      });
我想知道如何为此编写
Karma
测试

到目前为止,我有这个代码,但id不起作用:

describe('ReplyCtrl', function() {

    beforeEach(module('conciergeApp'));

    beforeEach(module(function($provide) {
        $provide.service('CurrentUser', function() {
            return 1;
        });
    }));

    //Getting reference of the mocked service
    var mockUtilSvc;

    inject(function(CurrentUser) {
        mockUtilSvc = CurrentUser;
    });

    beforeEach(inject(function($rootScope, $controller) {
        scope = $rootScope.$new();
        ctrl = $controller('ReplyCtrl', {
            $scope: scope
        });
    }));

    it('should return value from mock dependency', inject(function(mockUtilSvc) {
        expect(mockUtilSvc()).toEqual(1);
    }));

});
这是我收到的错误消息:

Firefox 41.0.0 (Mac OS X 10.10.0) ReplyCtrl should return value from mock dependency FAILED
    Error: [$injector:unpr] Unknown provider: mockUtilSvcProvider <- mockUtilSvc
Firefox 41.0.0(Mac OS X 10.10.0)ReplyCtrl应该从模拟依赖项返回值失败
错误:[$injector:unpr]未知提供程序:mockUtilSvcProvider1)您的
inject
位置错误。您正在测试
中指定注入函数,只需删除它即可

i、 e

将成为

 it('should return value from mock dependency', function() {
    expect(mockUtilSvc()).toEqual(1);
});
2) 现在的问题是,
mockUtilSvc
是一个服务实例,而不是您定义的函数,同样基于您的mock,您需要将其定义为factory(即返回1作为factory的值,并且它不是
new
able)

3) 你也可以这样写:

$provide.value('CurrentUser', 1); //Provide the instance here right away
4) 您的第一次
注入
的位置也不正确。您只是在运行它,而不是在每个spec运行期间运行和分配实例
在每次
迭代之前,您需要将服务实例的值设置为您的变量,即:

 beforeEach(inject(function(CurrentUser) {
    mockUtilSvc = CurrentUser;
}));
示例测试:

describe('ReplyCtrl', function() {
   var mockData = {
            id: 1234,
            hotel_id: 1,
        }, mockUtilSvc, scope, ctrl  ;


    beforeEach(module('conciergeApp', function($provide) {
        $provide.value('CurrentUser', mockData);
    }));

    beforeEach(inject(function(CurrentUser, $rootScope, $controller) {
        mockUtilSvc = CurrentUser;
        scope = $rootScope.$new();
        ctrl = $controller('ReplyCtrl', {
            $scope: scope
        });
    }));

    it('should return value from mock dependency', function() {
        expect(mockUtilSvc.id).toEqual(mockData.id);
    });
});

注意:还有其他方法可以模拟和注入模拟。例如,在这种情况下,您实际上也不需要使用
$provide.value
。相反,您可以创建模拟对象,并在控制器实例化期间将其传入,因为您可以完全控制该对象以传递依赖项,如下所示:

  ctrl = $controller('ReplyCtrl', {
            $scope: scope,
            CurrentUser: mockUtilSvc
   });
如果使用更复杂的服务和方法,您可以像这样创建mock

  mockSvc = jasmin.createSpyObj('MyService', ['method1', 'method2']);
  mockSvc.method1.and.returnValue($q.when(mockData)); //Simulating a promise returned from an $http call  in the method.

Hist first
inject
也位于错误的位置。他应该在每次
之前把它放在一个
中。Phil True,我在步骤4中提到过,可能不太清楚。让我更新一下。谢谢你。@PSL回答得很好,谢谢你的详细解释。这使得这里发生的事情以及如何设置这个模拟服务测试背后的逻辑更加清晰。非常感谢。
describe('ReplyCtrl', function() {
   var mockData = {
            id: 1234,
            hotel_id: 1,
        }, mockUtilSvc, scope, ctrl  ;


    beforeEach(module('conciergeApp', function($provide) {
        $provide.value('CurrentUser', mockData);
    }));

    beforeEach(inject(function(CurrentUser, $rootScope, $controller) {
        mockUtilSvc = CurrentUser;
        scope = $rootScope.$new();
        ctrl = $controller('ReplyCtrl', {
            $scope: scope
        });
    }));

    it('should return value from mock dependency', function() {
        expect(mockUtilSvc.id).toEqual(mockData.id);
    });
});
  ctrl = $controller('ReplyCtrl', {
            $scope: scope,
            CurrentUser: mockUtilSvc
   });
  mockSvc = jasmin.createSpyObj('MyService', ['method1', 'method2']);
  mockSvc.method1.and.returnValue($q.when(mockData)); //Simulating a promise returned from an $http call  in the method.