Angular Controller Mock 未在我的 Mocha 测试中持续存在
Angular Controller Mock is not perisisting in my Mocha test
目前 运行宁 Angular 1.2.x 与 karma-mocha 0.2.0 和 karma-chai 0.1.0。
以下是我尝试为基于 Mentors
模块的 MentorAvailabilityDashboardCtrl
编写一些简单的单元测试。单独 运行 时一切都通过了,但是当我按原样 运行 测试时,我收到一条错误消息 "Error: [ng:areq] Argument 'MentorAvailabilityDashboardCtrl' is not a function, got undefined"
这让我觉得 Mocha 或 AngularMock 在测试得到 运行 一次后被重置,之后未定义。
示例:
一次性测试运行ning
- 第一次测试 = 通过
- 第二次测试 = 失败 "MentorAvailabilityDashboardCtrl got undefined"
- 第三次测试 = 失败 "MentorAvailabilityDashboardCtrl got undefined"
- 第四次测试 = 失败 "MentorAvailabilityDashboardCtrl got undefined"
一次测试 运行ning(评论其他测试)
- 第一次测试 = 通过
- 第二次测试 = 通过
- 第三次测试 = 通过
- 第四次测试 = 通过
问题:
为什么我的控制器在第一次测试后变得未定义 运行 我能做些什么让它在每次测试中都保持不变 运行?
我的代码:
'use strict';
/* globals gon: false */
import angular from 'angular';
describe('MentorAvailabilityDashboardCtrl', function() {
let createController, $scope;
beforeEach(function() {
angular.module('Mentors', []);
require('./mentor_availability_dashboard')
angular.mock.module('Mentors');
});
beforeEach(angular.mock.inject(function ($rootScope, $controller) {
function MockMentorProfile() {}
function MockFlash() {}
$scope = $rootScope.$new()
createController = $controller('MentorAvailabilityDashboardCtrl', {
$scope: $scope,
MentorProfile: MockMentorProfile,
Flash: MockFlash
});
}));
describe('validation checks', function() {
it('should invalidate form fields on initialization', function() {
expect($scope.validatedFields()).to.eq(false);
});
it('should validate specifc field on initialization', function() {
$scope.courseFilter = 'Rails';
expect($scope.fieldValidated($scope.courseFilter)).to.eq(true);
});
it('should validate form fields on completion', function() {
$scope.courseFilter = 'Rails';
$scope.osFilter = 'Windows';
$scope.studentFilter = { student: 'Billy' };
$scope.paceFilter = '12 weeks';
$scope.startFilter = { monday: 'Monday' };
expect($scope.validatedFields()).to.eq(true);
});
it('should be able to click form with clearForm()', function() {
$scope.courseFilter = 'Rails';
$scope.clearForm()
expect($scope.courseFilter).to.eq('');
});
});
});
实际错误:
PhantomJS 1.9.8 (Mac OS X 0.0.0) MentorAvailabilityDashboardCtrl "before each" hook: workFn for "should validate specifc field on initialization" FAILED
Error: [ng:areq] Argument 'MentorAvailabilityDashboardCtrl' is not a function, got undefined
http://errors.angularjs.org/1.2.26/ng/areq?p0=MentorAvailabilityDashboardCtrl&p1=not%20a%20function%2C%20got%20undefined
at assertArg (/Users/bdoug/Bloc/vendor/assets/bower_components/angular/angular.js:1509)
at assertArgFn (/Users/bdoug/Bloc/vendor/assets/bower_components/angular/angular.js:1520)
at /Users/bdoug/Bloc/vendor/assets/bower_components/angular/angular.js:7278
at /Users/bdoug/Bloc/frontend/test/tests_index.js:15072 <- webpack:///frontend/legacy_org/mentors/mentor_availability_dashboard.test.js:23:8
at invoke (/Users/bdoug/Bloc/vendor/assets/bower_components/angular/angular.js:3966)
at workFn (/Users/bdoug/Bloc/vendor/assets/bower_components/angular-mocks/angular-mocks.js:2161)
您似乎需要在 beforeEach 块中定义控制器,这可能与此有关。可能是范围界定问题。您可以尝试避免 angular 一起模拟,直接测试控制器功能。由于您使用的是 es6 模块,因此您可以将控制器函数直接导出为命名导出。
export function MyController($scope, Flash) {
//...
}
MyController.$inject = ['$scope', 'Flash'];
angular.module('Mentors').controller('MyController')
然后在测试
import sinon from 'sinon';
import {MyController} from './my_controller'
it('...', function() {
let scope = {};
let Flash = sinon.mock();
MyController(scope, Flash);
//... assertions
})
目前 运行宁 Angular 1.2.x 与 karma-mocha 0.2.0 和 karma-chai 0.1.0。
以下是我尝试为基于 Mentors
模块的 MentorAvailabilityDashboardCtrl
编写一些简单的单元测试。单独 运行 时一切都通过了,但是当我按原样 运行 测试时,我收到一条错误消息 "Error: [ng:areq] Argument 'MentorAvailabilityDashboardCtrl' is not a function, got undefined"
这让我觉得 Mocha 或 AngularMock 在测试得到 运行 一次后被重置,之后未定义。
示例:
一次性测试运行ning
- 第一次测试 = 通过
- 第二次测试 = 失败 "MentorAvailabilityDashboardCtrl got undefined"
- 第三次测试 = 失败 "MentorAvailabilityDashboardCtrl got undefined"
- 第四次测试 = 失败 "MentorAvailabilityDashboardCtrl got undefined"
一次测试 运行ning(评论其他测试)
- 第一次测试 = 通过
- 第二次测试 = 通过
- 第三次测试 = 通过
- 第四次测试 = 通过
问题:
为什么我的控制器在第一次测试后变得未定义 运行 我能做些什么让它在每次测试中都保持不变 运行?
我的代码:
'use strict';
/* globals gon: false */
import angular from 'angular';
describe('MentorAvailabilityDashboardCtrl', function() {
let createController, $scope;
beforeEach(function() {
angular.module('Mentors', []);
require('./mentor_availability_dashboard')
angular.mock.module('Mentors');
});
beforeEach(angular.mock.inject(function ($rootScope, $controller) {
function MockMentorProfile() {}
function MockFlash() {}
$scope = $rootScope.$new()
createController = $controller('MentorAvailabilityDashboardCtrl', {
$scope: $scope,
MentorProfile: MockMentorProfile,
Flash: MockFlash
});
}));
describe('validation checks', function() {
it('should invalidate form fields on initialization', function() {
expect($scope.validatedFields()).to.eq(false);
});
it('should validate specifc field on initialization', function() {
$scope.courseFilter = 'Rails';
expect($scope.fieldValidated($scope.courseFilter)).to.eq(true);
});
it('should validate form fields on completion', function() {
$scope.courseFilter = 'Rails';
$scope.osFilter = 'Windows';
$scope.studentFilter = { student: 'Billy' };
$scope.paceFilter = '12 weeks';
$scope.startFilter = { monday: 'Monday' };
expect($scope.validatedFields()).to.eq(true);
});
it('should be able to click form with clearForm()', function() {
$scope.courseFilter = 'Rails';
$scope.clearForm()
expect($scope.courseFilter).to.eq('');
});
});
});
实际错误:
PhantomJS 1.9.8 (Mac OS X 0.0.0) MentorAvailabilityDashboardCtrl "before each" hook: workFn for "should validate specifc field on initialization" FAILED
Error: [ng:areq] Argument 'MentorAvailabilityDashboardCtrl' is not a function, got undefined
http://errors.angularjs.org/1.2.26/ng/areq?p0=MentorAvailabilityDashboardCtrl&p1=not%20a%20function%2C%20got%20undefined
at assertArg (/Users/bdoug/Bloc/vendor/assets/bower_components/angular/angular.js:1509)
at assertArgFn (/Users/bdoug/Bloc/vendor/assets/bower_components/angular/angular.js:1520)
at /Users/bdoug/Bloc/vendor/assets/bower_components/angular/angular.js:7278
at /Users/bdoug/Bloc/frontend/test/tests_index.js:15072 <- webpack:///frontend/legacy_org/mentors/mentor_availability_dashboard.test.js:23:8
at invoke (/Users/bdoug/Bloc/vendor/assets/bower_components/angular/angular.js:3966)
at workFn (/Users/bdoug/Bloc/vendor/assets/bower_components/angular-mocks/angular-mocks.js:2161)
您似乎需要在 beforeEach 块中定义控制器,这可能与此有关。可能是范围界定问题。您可以尝试避免 angular 一起模拟,直接测试控制器功能。由于您使用的是 es6 模块,因此您可以将控制器函数直接导出为命名导出。
export function MyController($scope, Flash) {
//...
}
MyController.$inject = ['$scope', 'Flash'];
angular.module('Mentors').controller('MyController')
然后在测试
import sinon from 'sinon';
import {MyController} from './my_controller'
it('...', function() {
let scope = {};
let Flash = sinon.mock();
MyController(scope, Flash);
//... assertions
})