Моноблочные тесты для приложения Firebase
Я использую firebase 3.3.0, и я хочу использовать signInWithEmailAndPassword функцию my mocha unit test, но я получаю сообщение об ошибке auth/network- запроса не удалось
Unhandled rejection Error: A network error (such as timeout, interrupted connection or unreachable host) has occurred.
test.js
const FIREBASE_CONFIG = {
apiKey: "AIzaSyDdA1POUWy9eid1AdBYuMdxch_k8ob7Qrg",
authDomain: "my-app.firebaseapp.com",
databaseURL: "https://my-app.firebaseio.com",
storageBucket: "my-app.appspot.com",
};
const FIREBASE_API_REF = firebase.initializeApp(FIREBASE_CONFIG);
before(function (done) {
promise = new Promise(function (resolve, reject) {
return FIREBASE_API_REF.auth().signInWithEmailAndPassword(firstUserEmail, firstUserPassword)
.then(function (userData) {
firstUserId = userData.uid;
resolve(userData);
done();
}, function (error) {
return reject(error);
})
});
});
package.json
"scripts": {
"test": "mocha --grep ./e2e.js --invert --compilers js:babel-register -R spec --ui bdd --timeout 7000"
}
Ответы
Ответ 1
Когда вы говорите: "Я хочу использовать функцию signInWithEmailAndPassword в моем мокко unit test" , тогда я бы сказал вам: "почему"?
Вы пытаетесь помочь команде Firebase, проверяя, что их служба аутентификации работает? Это мило с вашей стороны, но если вы хотите протестировать свое приложение, вам следует НЕ вызывать firebase вообще в unit test. Что вы действительно хотите проверить, так это то, что ответ, подобный тому, что отвечает Firebase, правильно обрабатывается вашим приложением в коде, который запускается после ответа.
Если бы мне было поручено написать тест для этого, я бы использовал библиотеку синонов с моккой и создаю заглушку, которая вызывает другую функцию, которая возвращает некоторые данные вместо фактического вызова Firebase:
Это иллюстрирует синтаксис для заглушки sinon:
var stub = sinon.stub(object, "method", func);
Это то, что я сделал бы в вашем примере:
var stub = sinon.stub(FIREBASE_API_REF.auth(), "signInWithEmailAndPassword"
, () => {
// Simply return a JSON object that is similar to the normal response from Firebase
return {
name: "Jim",
data: {
something: "some stuff"
}
});
Ответ 2
Вероятно, вы больше его не наносили, но вместо создания заглушки я просто использовал spyOn, и он работал как шарм.
![введите описание изображения здесь]()
Ответ 3
Для кого-либо другого, столкнувшегося с этой проблемой, я смог определить, что проблема возникла из глобального объекта XMLHttpRequest
из jsdom. Я смог избавиться от ошибки, используя этот код для установки моих глобальных переменных:
var doc = jsdom.jsdom('<!doctype html><html><body></body></html>');
global.window = doc.defaultView;
for (var key in window) {
if (!window.hasOwnProperty(key)) continue;
if (key in global) continue;
if (key == 'XMLHttpRequest') continue;
global[key] = window[key];
}