控制器内的模拟服务返回未定义

时间:2016-02-25 17:58:47

标签: angularjs unit-testing jasmine karma-jasmine angularjs-controller

我正在尝试测试一些非常简单的东西:一个调用执行http请求的服务的控制器。

控制器:

define(['module'], function (module) {
    'use strict';

    var MyController = function ($scope, MyService) {

        $scope.testScope = 'karma is working!';

        MyService.getData().then(function (data) {
            $scope.result = data.hour
        });
    };    

    module.exports = ['$scope', 'MyService', MyController ];
});

测试:

define(['require', 'angular-mocks'], function (require) {
'use strict';

var angular = require('angular');

describe("<- MyController Spec ->", function () {    

    var controller, scope, myService, serviceResponse;

    serviceResponse= {
        id: 12345,
        hour: '12'
    };

    beforeEach(angular.mock.module('myApp'));

    beforeEach(inject(function (_$controller_, _$rootScope_, _MyService_, $q) {
        scope = _$rootScope_.$new();
        var deferred = $q.defer();
        deferred.resolve(serviceResponse);

        myService = _MyService_;
        spyOn(myService, 'getData').and.returnValue(deferred.promise);

        controller = _$controller_('MyController', {$scope: scope});  
        scope.$apply();
    }));

    it('should verify that the controller exists ', function() {
        expect(controller).toBeDefined();
    });    

    it('should have testScope scope equaling *karma is working*', function() {
        expect(scope.testScope ).toEqual('karma is working!');
    });
});

});

有了上述内容,我收到错误:

TypeError: 'undefined' is not an object (evaluating 'spyOn(myService, 'getData').and.returnValue')

1 个答案:

答案 0 :(得分:0)

解决了问题 - 使用Jasmine 1x ..升级到2.0并按预期工作