如何在单元测试中注入Angular控制器

How can I inject an Angular controller into my unit test

本文关键字:注入 Angular 控制器 单元测试      更新时间:2023-09-26

我真的希望这是一个微不足道的问题。是的,我有RTF。实际上,我使用Angular文档化的方法来注入控制器,但由于某些原因,我的控制器没有定义。这里的主要区别是,我习惯于开发单模块应用程序,而这次我有了一个多模块应用程序。我认为这不会有什么不同,但你做到了。我将直接进入代码:,而不是冗长的描述

使用Angular 1.2.16

单元测试框架:Jasmine

app.js

 angular.module('OBB', [
  // Native AngularJS DI
  'ngResource', 'ngCookies', 
  // bunch of modules
  ...
  // OBB Page Modules
  'OBB.home', 'OBB.buckets', 'OBB.company', 'OBB.advSearch', 'OBB.users'
])

所以,我正在尝试测试OBB.home模块中的控制器。

home.js

angular.module('OBB.home', ['ui.router'])
.controller('HomeCtrl', ['$log', '$rootScope', '$scope', '$state', 'AUTH_EVENTS',  
  function HomeCtrl ($log, $rootScope, $scope, $state, AUTH_EVENTS) {
    $scope.signInFormData = {
      email: null, password: null
    };
    //more code...
}]);

home.spec.js

describe('Unit Home Controllers: ', function () {
  var homeController, scope;
  beforeEach(module('OBB.home'));
  beforeEach(inject(function (_$rootScope_, $controller) {
      scope = _$rootScope_.$new();
      homeController = $controller('HomeCtrl', {
        $rootScope: _$rootScope_,
        $scope: scope,
        $log: {},
        $state: {},
        AUTH_EVENTS: {},
      });
    }));
  it('Home Controller is correctly instantiated', inject(function () {
    expect(scope).toBeDefined();  // Pass
    expect(scope.signInFormData).toBeDefined();  // Fails
  }));
});

您需要模拟/加载依赖项。

describe('Unit Home Controllers: ', function () {
  var homeController, scope;
  beforeEach(module('OBB.home'));
  beforeEach(inject(function (_$rootScope_, $controller) {
      scope = _$rootScope_.$new();
      homeController = $controller('HomeCtrl', {
        $rootScope: _$rootScope_,
        $scope: scope,
        $log: {},  //You will have to add methods as needed
        $state: {},
        AUTH_EVENTS: {}
      });
    }));
  it('Home Controller is correctly instantiated', inject(function () {
    expect(scope).toBeDefined();  // Fails
    expect(scope.signInFormData).toBeDefined();  // Fails
  }));
});