2016-04-09 37 views
2

新角和以下从我以前的帖子angularjs jasmine tests: Variable vm not found 我在我的角度测试有一个TypeError,并不知道什么问题是。下面是我的测试:AngularJS茉莉花测试:TypeError:'undefined'不是一个对象

(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 
+3

你能显示控制器的代码?这将有助于更好地理解问题。看起来'DeliveriesController'不仅取决于'$ scope',还取决于'DeliveriesService'。当你实例化控制器时,你应该提供它所有的依赖关系(无论是真实的还是模拟的)。 – Stubb0rn

+1

你说得对。情况就是如此。我添加了DeliveriesService作为注入到测试中,它工作。谢谢你 – noobcoder

+0

@ Stubb0rn请发表您的评论作为答案。它真的帮了我,但如果你把它作为评论,它不会很容易找到。 –

回答

0

礼貌:从@StubbbOrn评论:

你能显示控制器的代码?这将有助于更好地理解问题。看起来DeliveriesController不仅取决于$范围,还取决于DeliveriesService。当你实例化控制器时,你应该提供它所有的依赖关系(无论是真实的还是模拟的)。

该解决方案适用于我,是解决方案。谢谢@StubbOrn

0

看起来你正在控制器中使用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) 
}));