web-dev-qa-db-fra.com

Chargement du fichier externe à partir du test Karma/Jasmine

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:

http://date.jsontest.com/

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.

24
AlexB

Ê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 }
    ],
20
jsplaine

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

Installer

bower install karma-read-json

Usage

  1. Mettez karma-read-json.js dans vos fichiers Karma, Exemple:

    files = [
    ...
    'bower_components/karma-read-json/karma-read-json.js',
    ...
    ]
    
  2. Assurez-vous que votre JSON est servi par Karma, Exemple:

    files = [
    ...
    {pattern: 'json/**/*.json', included: false},
    ...
    ]
    
  3. Utilisez la fonction readJSON dans vos tests. Exemple:

    var valid_respond = readJSON('json/foobar.json');
    $httpBackend.whenGET(/.*/).respond(valid_respond);
    
7
PizzaPanther

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(...);
    });
});
2
Siggen

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');

0
F. Javier R. Donado