Я пытался настроить автономные модульные тесты для полимерных веб-компонентов, которые используют последнюю версию распределенной базы данных Firebase. Некоторые из моих тестов проходят, но другие, которые выглядят почти идентичными пройденным, не работают должным образом.
Я создал проект на github, который демонстрирует мою конфигурацию, и ниже я приведу еще несколько комментариев.
Пример: https://github.com/doctor-g/wct-firebase-demo< /а>
В этом проекте есть два набора тестов, которые отлично работают. Самый простой — offline-test
. , который вообще не использует веб-компоненты. Это просто показывает, что можно использовать автономный режим базы данных firebase для запуска некоторых модульных тестов. В основе этого трюка лежит показанный ниже метод suiteSetup
, который я почерпнул из работы nfarina. на firebase-сервере.
suiteSetup(function() {
app = firebase.initializeApp({
apiKey: 'fake',
authDomain: 'fake',
databaseURL: 'https://fakeserver.firebaseio.com',
storageBucket: 'fake'
});
db = app.database();
db.goOffline();
});
Все тесты в offline-test
пройдены.
Следующий пакет — wct-firebase-demo-app_test.html
, которые тестируют одноименный веб-компонент. Этот набор содержит серию модульных тестов, которые настроены как offline-test
и проходят успешно. Следуя идее внедрения зависимостей, компонент wct-firebase-demo-app
имеет атрибут database
, в который передается ссылка на базу данных firebase, и он используется для выполнения всех вызовов firebase. Вот пример из комплекта:
test('offline set string from web component attribute', function(done) {
element.database = db;
element.database.ref('foo').set('bar');
element.database.ref('foo').once('value', function(snapshot) {
assert.equal(snapshot.val(), 'bar');
done();
});
});
У меня также есть несколько очень простых методов в компоненте, и в моей попытке провести триангуляцию к разрозненным частям я расскажу о них чуть позже. Достаточно сказать, что этот тест проходит:
test('offline push string from web component function', function(done) {
element.database = db;
let resultRef = element.pushIt('foo', 'bar');
element.database.ref('foo').once('value', function(snapshot) {
assert.equal(snapshot.val()[resultRef.key], 'bar');
done();
});
});
и поддерживается этой реализацией в wct-firebase-demo-app
:
pushIt: function(at, value) {
return this.database.ref(at).push(value);
},
Опять же, все это проходит. Теперь мы подходим к настоящему затруднению. Есть набор тестов для другого элемента, x-element
, у которого есть метод pushData
:
pushData: function(at, data) {
this.database.ref(at).push(data);
}
Тест для этого метода является единственным тестом в его набор:
test('pushData has an effect', function(done) {
element.database = db;
element.pushData('foo', 'xyz');
db.ref('foo').once('value', function(snapshot) {
expect(snapshot.val()).not.to.be.empty;
done();
});
});
Этот тест не проходит. Во время выполнения этого теста в консоли появляется сообщение об ошибке:
Your API key is invalid, please check you have copied it correctly.
Установив несколько точек останова и пройдясь по выполнению, мне кажется, что эта ошибка возникает после вызова once
, но до срабатывания обратного вызова. Обратите внимание, опять же, это не происходит с той же тестовой структурой, описанной выше, что и в wct-firebase-demo-app
.
Вот где я застрял. Почему наборы offline-test
и wct-firebase-demo-app_test
работают нормально, но я получаю эту ошибку ключа API в x-element_test
? Единственная другая подсказка, которая у меня есть, заключается в том, что если я скопирую действительный ключ API в свою конфигурацию initializeApp
, то вместо этого я получу тестовый тайм-аут.
ОБНОВИТЬ:
Вот (исправленное вместе) изображение моего журнала консоли при запуске тестов.:
Чтобы проиллюстрировать проблему, поднятую tony19 ниже, вот журнал консоли, где закомментированы только pushData has an effect
в x-element_test
: