1

Будучи новичком в тестировании модулей 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 
    }); 
}; 

ответ

8

я, наконец, удалось выяснить, в чем проблема. PhantomJS не описывал сообщения об ошибках вообще. По-видимому, не удалось создать экземпляр моего основного модуля Angular mainApp, потому что я не включил некоторые исходные файлы для внешних модулей, от которых зависит мой основной модуль (например, ngAnimate и т. Д.).

Поэтому я переключил свой браузер для тестирования с PhantomJS на Chrome и фактически дал мне значимые ошибки, которые быстро указывали в правильном направлении.

+0

Вы правы! Chrome выводит гораздо лучшую информацию о том, что не удалось, чем PhantomJS. – dsuess

+0

Возможно, вы захотите посмотреть на wallabyjs.com, чтобы помочь вам, я бы не стал писать тест без него. – Maccurt

0

Проверьте

  • инсталлируется система тестирования, условия испытаний относится к каркасу тестирования вы используете.

  • «karma.config.js» настроен для рамки, установленной вами .

  • Используйте проверку браузера вместо тестирования Headless PhantomJS, чтобы получить четкие указания.

В большинстве случаев это ошибки.

Смежные вопросы