在 Angular 控制器中使用 vm 进行 Jasmine 测试

Jasmine Testing with vm in Angular controller

尝试在 Jasmine & Karma 和 AngularJs 框架中测试一个简单的测试, 控制器:

(function() {
'use strict';
angular
    .module('bsp.account')
    .controller('Account', Account);

/* @ngInject */
function Account(userService, accountService) {

    var vm = this;

    vm.title = 'Accounts';
    vm.username = userService.getUsername();

    vm.showPasswordModal = accountService.showPasswordModal;
    vm.showLogoutModal = accountService.showLogoutModal;

    activate();
    ////////////////
    function activate() {

    }
}
})();

任何人都可以告诉我如何使用 Jasmin 和这段代码编写一个简单的测试用例吗?也可能是一种可能的方法及其测试, 我的测试代码如下:

describe('Account', function() {

var scope,
    controller;

beforeEach(module('bsp.account'));
//sample testCase--
it('testCheck', function() {
    expect('helloWorld').toBe("helloWorld");
});

describe('Account', function() {
    //injecting the scope&controller--
    beforeEach(inject(function($rootScope, $controller) {
        scope = $rootScope.$new();
        controller = $controller('Account', {
            $scope: scope
        });
        scope.vm = controller;

    }));

});
it("checkTitle",function(){
var vm = controller("Account",{$scope:scope});
expect(vm.title).toEqual("Accounts"); 
}); 
});

业力,回应:

Running "karma:unit:run" (karma) task
[2015-10-23 15:11:03.542] [DEBUG] config - Loading config   /vagrant/frontend/build/karma-unit.js
    ✗ checkTitle
    TypeError: 'undefined' is not a function (evaluating 'controller("Account",{$scope:scope})')
    at /vagrant/frontend/src/app/account/account.controller.spec.js:33

LOG LOG: undefined
PhantomJS 1.9.8 (Linux 0.0.0) LOG: undefined
LOG LOG: '** if *********'
PhantomJS 1.9.8 (Linux 0.0.0) LOG: '** if *********'

PhantomJS 1.9.8 (Linux 0.0.0): Executed 37 of 37 (1 FAILED) (0.134 secs / 0.128 secs)

Warning: Task "karma:unit:run" failed. Use --force to continue.

由于警告而中止。 于 2015 年 10 月 23 日星期五在 10.849 秒内完成 15:11:04 GMT-0700 (PDT) - 等待... 任何建议表示赞赏,我是 Jasmin 的新手 testing.Thank 你

您实际上是在 beforeEach 块中实例化了一个 BoardPerformance 控制器,但您显示的代码是针对 Account 的,所以我知道这是一个错误。

所以对于 运行 的简单测试用例,试试这个:

describe('Account', function() {

  var scope, controller, userServiceMock;

  beforeEach(module('bsp'));

  beforeEach(function() {
    userServiceMock = {
      getUsername: function(){} 
    }
  });

  beforeEach(inject(function($rootScope, $controller) {
    scope = $rootScope.$new();
    controller = $controller('Account', {
      'userService': userServiceMock
    });
  }));

  it('checkTitle', function(){
    expect(controller.title).toEqual('Accounts'); 
  });

});

所以这是 Jasmin 中的新测试用例,

describe('Account', function() { 
  var scope, controller, userServiceMock,accountServiceMock; 
  beforeEach(module('bsp')); 
  beforeEach(function() {
    userServiceMock = {
       getUsername: function(){} //this is a method inside userService
    };
    accountServiceMock = {
      showPasswordModal :function(){}//this is a method inside accountService
    };
  });

  beforeEach(inject(function($rootScope, $controller) {
scope = $rootScope.$new();
controller = $controller('Account', {
  'userService': userServiceMock,
  'accountService':accountServiceMock
});
  }));

 describe('testing Title',function(){
   it('checkTitle', function(){
   expect(controller.title).toEqual('Accounts'); 
   });  
 }); 
});

它非常基础,但包含具有依赖关系的控制器以及 vm 的必要信息。感谢 Pablo