Будучи новичком в тестировании модулей JS и, в частности, в области углового тестирования, я попытался написать свои собственные тесты с помощью Jasmine и Karma. После многочисленных неудачных попыток написать собственные тесты, я решил отступить и проверить, все ли работает нормально, поэтому я скопировал пример контроллера и его тесты из Angular Documentation on Unit testing в свой проект, и я не могу заставить это работать. Я чувствую себя, как полный идиот, который не может даже получить копию вставили код для работы ..Угловой пример тестирования Fail
Так вот контроллер, который я инициализируется в файле step1Ctrl.js
:
Модуль инициализируется в другом файле.
var mainApp = angular.module("mainApp");
mainApp.controller('PasswordController', function PasswordController($scope) { $scope.password = ''; $scope.grade = function() {
var size = $scope.password.length;
if (size > 8) {
$scope.strength = 'strong';
} else if (size > 3) {
$scope.strength = 'medium';
} else {
$scope.strength = 'weak';
} }; });
А вот те тесты, которые живут внутри step1Ctrl.spec.js
:
describe('PasswordController', function() {
beforeEach(module('mainApp'));
var $controller;
beforeEach(inject(function(_$controller_){
// The injector unwraps the underscores (_) from around the parameter names when matching
$controller = _$controller_;
}));
describe('$scope.grade', function() {
var $scope, controller;
beforeEach(function() {
$scope = {};
controller = $controller('PasswordController', { $scope: $scope });
});
it('sets the strength to "strong" if the password length is >8 chars', function() {
$scope.password = 'longerthaneightchars';
$scope.grade();
expect($scope.strength).toEqual('strong');
});
it('sets the strength to "weak" if the password length <3 chars', function() {
$scope.password = 'a';
$scope.grade();
expect($scope.strength).toEqual('weak');
});
});
});
буквально копировать-вставить из документации.
Так ошибка, что я получаю от запуска тестов является:
TypeError: undefined is not a constructor (evaluating '$controller('PasswordController', { $scope: $scope })')
Который говорит мне, что $controller
функция во втором beforeEach
не удается, так как $controller
не определено. Таким образом, похоже, что первый beforeEach
не запускается, или он делает, но неопределенное значение вводится функцией inject
.
Я также использую browserify
, если это имеет значение.
Вот мой karma.conf.js
, если это помогает, а также:
module.exports = function(config) {
config.set({
basePath: '',
frameworks: ['browserify', 'jasmine'],
files: [
'https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.0-beta.1/angular.js',
'https://cdnjs.cloudflare.com/ajax/libs/angular-ui-router/0.2.15/angular-ui-router.js',
'https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.0-beta.1/angular-mocks.js',
'test/unit/**/*.js'
],
exclude: [
],
preprocessors: {
'app/main.js': ['browserify']
},
reporters: ['progress'],
port: 9876,
colors: true,
logLevel: config.LOG_INFO,
autoWatch: true,
browsers: ['PhantomJS'],
browserify: {
debug: true,
transform: []
},
plugins: [
'karma-phantomjs-launcher', 'karma-jasmine', 'karma-bro'
],
singleRun: false,
concurrency: Infinity
});
};
Вы правы! Chrome выводит гораздо лучшую информацию о том, что не удалось, чем PhantomJS. – dsuess
Возможно, вы захотите посмотреть на wallabyjs.com, чтобы помочь вам, я бы не стал писать тест без него. – Maccurt