Загрузка внешнего файла из теста 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...
И он проходит.
Ответы
Ответ 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');