Подтвердить что ты не робот

Загрузка внешнего файла из теста Karma/Jasmine

Я пытаюсь выполнить тест Jasmine (используя Karma и IntelliJ 13) для проверки файлов JSON. В идеале, мой тест просто загрузил бы файл JSON в объект данных, а затем позвольте мне разобрать, чтобы проверить правильность форматирования и данных. Мне не нужно проверять функции до или после, а также не нужно тестировать сервер.

Моя основная настройка такова:

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

Проблема в том, что независимо от того, какой путь я использую, я получаю ошибку 404, и файл не загружается. Я попытался загрузить внешний результат JSON с удаленного сервера с помощью этой тестовой службы:

http://date.jsontest.com/

И это работает.

Мой тестовый файл имеет имя /test/mySpec.js, а мой файл karma.conf.js находится в корне. Я перемещал файл JSON во все эти места без везения. Что я делаю неправильно?

ОБНОВЛЕНИЕ С ОТВЕТОМ:

В ответ ниже я добавил это в свой файл karma.conf.js:

// fixtures
{ pattern: 'test/*.json',
    watched: true,
    served:  true,
    included: false
}

Затем я написал свой тест следующим образом:

    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...

И он проходит.

4b9b3361

Ответ 1

Вы обслуживаете файл JSON через karma.config.js?

Вы можете обслуживать файлы JSON через fixture:

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 }
    ],

Ответ 2

Обслуживание JSON через прибор является самым простым, но из-за нашей настройки мы не могли бы так легко сделать, поэтому я написал альтернативную вспомогательную функцию:

Установка

bower install karma-read-json

Использование

  • Поместите karma-read-json.js в свои файлы Karma, Пример:

    files = [
    ...
    'bower_components/karma-read-json/karma-read-json.js',
    ...
    ]
    
  • Убедитесь, что ваш JSON обслуживается кармой, например:

    files = [
    ...
    {pattern: 'json/**/*.json', included: false},
    ...
    ]
    
  • Используйте функцию readJSON в своих тестах. Пример:

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

Ответ 3

Если вы пытаетесь загрузить файл HTML и хотите избежать использования jasmine-jquery, вы можете воспользоваться препроцессором karma-ng-html2js.

В вашем файле karma.conf.js:

// generate js files from html templates
preprocessors: {
    'resources/*.html': 'ng-html2js'
},

files: [
    ...
    'resources/*.html'
],

plugins: [
    ...
    'karma-ng-html2js-preprocessor'
],

В вашей спецификации жасмина:

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

Ответ 4

Вы пробовали просто потребовать json файл и сохранить его в качестве глобальной переменной в своем тесте?

Я разрабатываю проект Angular2 прямо сейчас (используя Angular CLI), и с этой настройкой он работает:

// On the very beginning of the file let mockConfig = require('./test/config.json');