AngularJS Jasmine测试:类型错误:'未定义'不是对象

AngularJS Jasmine test: TypeError: 'undefined' is not an object

本文关键字:对象 未定义 Jasmine 错误 AngularJS 测试 类型      更新时间:2024-04-13

Angular的新手,以及我之前关于angularjs jasmine测试的帖子的后续内容:找不到变量vm我在角度测试中遇到了TypeError,不确定问题出在哪里。这是我的测试:

(function(){
'use strict';
describe('Testing DeliveriesController', function() {
    beforeEach(module('app.deliveries'));
    describe('Testing deliveries controller', function(){
        var vm, controller;
        beforeEach(inject(function($controller, $rootScope){
            vm = $rootScope.$new();
            controller = $controller('DeliveriesController', {$scope:vm});
        }));
        afterEach(function() {
            vm = undefined;
            controller = undefined;
        });
        describe('priorities length', function(){
            it('it should test priority length', function () {
                expect(vm.priorities.length).toBe(0);
            });
        });
    });
  });
})();

我得到的错误如下:

PhantomJS 1.9.8 (Mac OS X 0.0.0) Testing DeliveriesController Testing deliveries controller priorities length it should test priority length FAILED
Error: [$injector:unpr] Unknown provider: DeliveriesServiceProvider <- DeliveriesService <- DeliveriesController
http://errors.angularjs.org/1.3.20/$injector/unpr?p0=DeliveriesServiceProvider%20%3C-%20DeliveriesService%20%3C-%20DeliveriesController
    at /Users/rgoti/ingestion/external-ingestion/app/public/bower_components/angular/angular.js:4031
    at getService (/Users/rgoti/ingestion/external-ingestion/app/public/bower_components/angular/angular.js:4178)
    at /Users/rgoti/ingestion/external-ingestion/app/public/bower_components/angular/angular.js:4036
    at getService (/Users/rgoti/ingestion/external-ingestion/app/public/bower_components/angular/angular.js:4178)
    at invoke (/Users/rgoti/ingestion/external-ingestion/app/public/bower_components/angular/angular.js:4210)
    at instantiate (/Users/rgoti/ingestion/external-ingestion/app/public/bower_components/angular/angular.js:4227)
    at /Users/rgoti/ingestion/external-ingestion/app/public/bower_components/angular/angular.js:8524
    at /Users/rgoti/ingestion/external-ingestion/app/public/bower_components/angular-mocks/angular-mocks.js:1916
    at /Users/rgoti/ingestion/external-ingestion/app/public/src/app/deliveries/deliveries.spec.js:12
    at invoke (/Users/rgoti/ingestion/external-ingestion/app/public/bower_components/angular/angular.js:4219)
    at workFn (/Users/rgoti/ingestion/external-ingestion/app/public/bower_components/angular-mocks/angular-mocks.js:2475)
undefined
TypeError: 'undefined' is not an object (evaluating 'vm.priorities.length')
    at /Users/rgoti/ingestion/external-ingestion/app/public/src/app/deliveries/deliveries.spec.js:23

提供:来自@StubbOrn:的评论

你能出示控制器的代码吗?这将有助于更好地理解这个问题。看起来DeliveriesController不仅依赖于$scope,还依赖于DeliveriesService。当您实例化控制器时,应该为它提供所有依赖项(真实的或模拟的)。

这个解决方案对我有效,而且就是解决方案。感谢@StubbOrn

看起来您正在控制器中使用DeliveriesService

无论何时使用服务,都需要确保注入该服务或使用$provider添加该服务。

beforeEach(inject(function($controller, $rootScope, _DeliveriesService_){
            vm = $rootScope.$new();
            DeliveriesSrvc = _DeliveriesService_;
            controller = $controller('DeliveriesController', {$scope:vm});
        }));

beforeEach(module(function ($provide) {
     mockObj = {
        functionName: jasmine.createSpy('functionName')
     }
     $provide.value('DeliveriesService',mockObj)
}));