J'ai une application Angular/Laravel existante dans laquelle Laravel agit comme une API pour l'interface angulaire servant uniquement les données JSON. La page qui charge l'application angulaire, index.php
, est actuellement servie par Laravel. À partir de là, Angular prend le relais.
J'ai beaucoup de difficulté à essayer de commencer avec Karma/Jasmine. Lorsque j'exécute mes tests avec karma start
ou karma start karma.conf.js
à partir du répertoire racine de mon projet, le message d'erreur suivant s'affiche:
ReferenceError: module is not defined
Plein rendement:
INFO [karma]: Karma v0.12.28 server started at http://localhost:9876/
INFO [launcher]: Starting browser Chrome
WARN [watcher]: Pattern "/Users/raph/coding/webroot/digitalocean/rugapp/public/rugapp/*.js" does not match any file.
INFO [Chrome 39.0.2171 (Mac OS X 10.9.5)]: Connected on socket 3OCUMp_xhrGtlGHwiosO with id 7897120
Chrome 39.0.2171 (Mac OS X 10.9.5) hello world encountered a declaration exception FAILED
ReferenceError: module is not defined
at Suite.<anonymous> (/Users/raph/coding/webroot/digitalocean/rugapp/tests/js/test.js:3:16)
at jasmineInterface.describe (/Users/raph/coding/webroot/digitalocean/rugapp/node_modules/karma-jasmine/lib/boot.js:59:18)
at /Users/raph/coding/webroot/digitalocean/rugapp/tests/js/test.js:1:1
Chrome 39.0.2171 (Mac OS X 10.9.5): Executed 2 of 2 (1 FAILED) (0.005 secs / 0.003 secs)
Cependant, le navigateur chrome se lance avec l’affichage suivant:
Mon fichier karma.conf.js
est le suivant:
// Karma configuration
// Generated on Mon Dec 22 2014 18:13:09 GMT-0500 (EST)
module.exports = function(config) {
config.set({
// base path that will be used to resolve all patterns (eg. files, exclude)
basePath: 'public/rugapp/',
// frameworks to use
// available frameworks: https://npmjs.org/browse/keyword/karma-adapter
frameworks: ['jasmine'],
// list of files / patterns to load in the browser
files: [
'*.html',
'**/*.js',
'../../tests/js/test.js',
'../../tests/js/angular/angular-mocks.js'
],
// list of files to exclude
exclude: [
],
// preprocess matching files before serving them to the browser
// available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
preprocessors: {
},
// test results reporter to use
// possible values: 'dots', 'progress'
// available reporters: https://npmjs.org/browse/keyword/karma-reporter
reporters: ['progress'],
// web server port
port: 9876,
// enable / disable colors in the output (reporters and logs)
colors: true,
// level of logging
// possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
logLevel: config.LOG_INFO,
// enable / disable watching file and executing tests whenever any file changes
autoWatch: true,
// start these browsers
// available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
browsers: ['Chrome'],
// Continuous Integration mode
// if true, Karma captures browsers, runs the tests and exits
singleRun: false
});
};
Mon fichier package.json
est présenté ci-dessous:
{
"devDependencies": {
"gulp": "^3.8.8",
"karma": "^0.12.28",
"karma-chrome-launcher": "^0.1.7",
"karma-jasmine": "^0.3.2",
"laravel-elixir": "*"
}
}
test.js
describe("hello world", function() {
var CreateInvoiceController;
beforeEach(module("MobileAngularUiExamples"));
beforeEach(inject(function($controller) {
CreateInvoiceController = $controller("CreateInvoiceController");
}));
describe("CreateInvoiceController", function() {
it("Should say hello", function() {
expect(CreateInvoiceController.message).toBe("Hello");
});
});
});
describe("true", function() {
it("Should be true", function() {
expect(true).toBeTruthy();
});
});
Toute aide serait grandement appréciée.
Cela aidera peut-être quelqu'un.
La solution, pour moi, était de m'assurer que angular-mocks.js
était chargé avant mes tests. Si vous n'êtes pas sûr, vous contrôlez l'ordre dans karma.conf.js
dans la section suivante:
// list of files / patterns to load in the browser
files: [
// include files / patterns here
Ensuite, pour que mon test charge réellement mon application angulaire, je devais procéder comme suit:
describe("hello world", function() {
var $rootScope;
var $controller;
beforeEach(module("YourAppNameHere"));
beforeEach(inject(function($injector) {
$rootScope = $injector.get('$rootScope');
$controller = $injector.get('$controller');
$scope = $rootScope.$new();
}));
beforeEach(inject(function($controller) {
YourControllerHere = $controller("YourControllerHere");
}));
it("Should say hello", function() {
expect(YourControllerHere.message).toBe("Hello");
});
});
Et dans votre manette,
app.controller('YourControllerHere', function() {
this.message = "Hello";
});
En outre, une autre façon:
describe("YourControllerHere", function() {
var $scope;
var controller;
beforeEach(function() {
module("YourAppNameHere");
inject(function(_$rootScope_, $controller) {
$scope = _$rootScope_.$new();
controller = $controller("YourControllerHere", {$scope: $scope});
});
});
it("Should say hello", function() {
expect(controller.message).toBe("Hello");
});
});
Profitez des tests!
L'erreur signifie que angular n'a pas pu injecter votre module. La plupart du temps, cela se produit car il manque une référence aux fichiers de script. Dans ce cas, assurez-vous que tout votre fichier de script est défini dans la configuration [fichiers] de karma. Portez une attention particulière aux chemins car, si votre dossier de script a une structure imbriquée, veillez à répertorier en tant que tel. Par exemple:
Scripts/Controllers/One/1.js
Scripts/Controllers/One/2.js
peut être répertorié comme dans karma.conf.js> fichiers comme:
Scripts/Controllers/**/*.js
Laissez simplement ceci ici pour les futurs chercheurs.
Si vous exécutez des tests unitaires angulaires dans le navigateur directement sans Karma (ou dans plunkr ou jsfiddle ect ...), il se peut alors que
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.2.0/angular.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.2.0/angular-route.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.2.0/angular-cookies.js"></script>
<!-- The Mocha Setup goes BETWEEN angular and angular-mocks -->
<script>
mocha.setup({
"ui": "bdd",
"reporter": "html"
});
</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.2.0/angular-mocks.js"></script>
<script src="myApp.js"></script>
<script src="myTest.js"></script> <!-- test is last -->
La configuration de moka va entre les mocs angulaires et angulaires
J'ai rencontré un message similaire et il s'est avéré que mon chemin de fichier angular-mocks
était erroné. J'ai utilisé npm pour installer angular
et angular-mocks
, et j'ai spécifié leur chemin incorrectement dans mon Karma.conf.js
comme ceci:
files: [
'node_modules/angular/angular.js',
'node_modules/angular/angular-mocks.js',
'scripts/*.js',
'tests/*.js'
],
Je devrais spécifier le chemin de angular-mocks.js
comme ceci:
'node_modules/angular-mocks/angular-mocks.js'
Une erreur très simple, mais qui pourrait prendre beaucoup de temps à localiser si vous venez de commencer avec les tests unitaires AngularJS et ne savez pas où chercher.