J'essaie d'effectuer un test Jasmine (à l'aide de Karma et d'IntelliJ 13) pour valider les fichiers JSON. Idéalement, mon test chargerait simplement un fichier JSON dans un objet de données, puis me laisser analyser pour vérifier la mise en forme et les données valides. Je n'ai pas besoin de valider les fonctions avant ou après, ni de tester sur un serveur.
Ma configuration de base est la suivante:
it("should load an external file", function(){
var asyncCallComplete, result,
_this = this;
// asyncCallComplete is set to true when the ajax call is complete
asyncCallComplete = false;
// result stores the result of the successful ajax call
result = null;
// SECTION 1 - call asynchronous function
runs(function() {
return $.ajax('/test/config.json', {
type: 'GET',
success: function(data) {
asyncCallComplete = true;
result = data;
},
error: function() {
asyncCallComplete = true;
}
});
});
// SECTION 2 - wait for the asynchronous call to complete
waitsFor(function() {
return asyncCallComplete !== false;
}, "async to complete");
// SECTION 3 - perform tests
return runs(function() {
return expect(result).not.toBeNull();
});
}
Le problème est que peu importe le chemin que j'utilise, j'obtiens une erreur 404 et le fichier ne se charge pas. J'ai essayé de charger un résultat JSON externe à partir d'un serveur distant à l'aide de ce service de test:
Et ça marche.
Mon fichier de test s'appelle /test/mySpec.js et mon fichier karma.conf.js se trouve à la racine. J'ai déplacé le fichier JSON vers tous ces emplacements sans succès. Qu'est-ce que je fais mal?
MISE À JOUR AVEC RÉPONSE:
D'après la réponse ci-dessous, j'ai ajouté ceci à mon karma.conf.js:
// fixtures
{ pattern: 'test/*.json',
watched: true,
served: true,
included: false
}
Ensuite, j'ai écrit mon test de cette façon:
var json:any;
it("should load a fixture", function () {
jasmine.getFixtures().fixturesPath = "base/test/"
var f = readFixtures("registration.json");
json = JSON.parse(f);
expect(json).toBeDefined();
})
it("should have a title", function () {
expect(json.title).toNotBe(null);
})
etc...
Et ça passe.
Êtes-vous en train de servir le fichier JSON via karma.config.js?
Vous pouvez servir des fichiers JSON via un appareil:
files: [
// angular
'angular.min.js',
'angular-route.js',
'angular-mocks.js',
// jasmine jquery helper
'jquery-1.10.2.min.js',
'jasmine-jquery.js',
// app
'../../public/js/app.js',
// tests
'*-spec.js',
// JSON fixture
{ pattern: '/test/*.json',
watched: true,
served: true,
included: false }
],
Servir JSON via le fixture est le plus simple mais à cause de notre configuration nous ne pouvions pas le faire facilement, alors j'ai écrit une fonction d'assistance alternative
bower install karma-read-json
Mettez karma-read-json.js dans vos fichiers Karma, Exemple:
files = [
...
'bower_components/karma-read-json/karma-read-json.js',
...
]
Assurez-vous que votre JSON est servi par Karma, Exemple:
files = [
...
{pattern: 'json/**/*.json', included: false},
...
]
Utilisez la fonction readJSON
dans vos tests. Exemple:
var valid_respond = readJSON('json/foobar.json');
$httpBackend.whenGET(/.*/).respond(valid_respond);
Si vous essayez de charger un fichier HTML et que vous voulez éviter d'utiliser jasmine-jquery , vous pouvez tirer parti du karma-ng-html2js-preprocessor .
Dans votre karma.conf.js :
// generate js files from html templates
preprocessors: {
'resources/*.html': 'ng-html2js'
},
files: [
...
'resources/*.html'
],
plugins: [
...
'karma-ng-html2js-preprocessor'
],
Dans votre spec jasmine:
beforeEach(module('resources/fragment.html'));
var $templateCache;
beforeEach(inject(function (_$templateCache_) {
$templateCache = _$templateCache_;
}));
describe('some test', function () {
it('should do something', function () {
// --> load the fragment.html content from the template cache <--
var fragment = $templateCache.get('resources/fragment.html');
expect(fragment).toBe(...);
});
});
Avez-vous essayé simplement de demander le fichier JSON et de le stocker en tant que variable globale dans votre test?
Je développe actuellement un projet Angular2 (en utilisant la CLI angulaire), et avec cette configuration, cela fonctionne:
// On the very beginning of the file
let mockConfig = require('./test/config.json');