首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Angularjs测试返回静态数据的简单工厂

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

Stack Overflow用户
提问于 2015-11-01 23:30:14
回答 1查看 901关注 0票数 5

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

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

代码语言:javascript
复制
angular.module('conciergeApp.services')
       .factory('CurrentUser', function() {
        return {
            id: 1,
            hotel_id: 1,
        }
      });

我想知道如何为此编写Karma测试?

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

代码语言:javascript
复制
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);
    }));

});

这是我一直收到的错误消息:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-01 23:49:32

( 1)你把inject放错地方了。在测试it中指定注入函数,只需删除它。

代码语言:javascript
复制
it('should return value from mock dependency', inject(function(mockUtilSvc) {
    expect(mockUtilSvc()).toEqual(1);
}));

会变成

代码语言:javascript
复制
 it('should return value from mock dependency', function() {
    expect(mockUtilSvc()).toEqual(1);
});

2)现在的问题是,mockUtilSvc是一个服务实例,而不是您定义的函数,而且根据您的模拟,您需要将它定义为工厂(也就是说,您将返回1作为工厂的值,它是不能的)。

代码语言:javascript
复制
beforeEach(module(function($provide) {
    $provide.factory('CurrentUser', function() {
        return 1;
       //If you expect factory to be a function then you need to return a function returning 1 here
    });
}));

代码语言:javascript
复制
expect(mockUtilSvc).toEqual(1);

3)你不妨写成:

代码语言:javascript
复制
$provide.value('CurrentUser', 1); //Provide the instance here right away

4)你的第一个inject也在错误的地方。您只是在运行它,而不是在每次规范运行期间运行和分配实例。before Each迭代您需要将服务实例的值设置为变量,即:

代码语言:javascript
复制
 beforeEach(inject(function(CurrentUser) {
    mockUtilSvc = CurrentUser;
}));

一个示例测试:

代码语言:javascript
复制
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。相反,您可以创建模拟对象并在控制器实例化期间传递它,因为您可以完全控制在那里传递依赖项,如下所示:

代码语言:javascript
复制
  ctrl = $controller('ReplyCtrl', {
            $scope: scope,
            CurrentUser: mockUtilSvc
   });

如果使用方法创建更复杂的服务,您可以创建类似这样的模拟。

代码语言:javascript
复制
  mockSvc = jasmin.createSpyObj('MyService', ['method1', 'method2']);
  mockSvc.method1.and.returnValue($q.when(mockData)); //Simulating a promise returned from an $http call  in the method.
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33468458

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档