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

Моноблочные тесты для приложения 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"
  }
4b9b3361

Ответ 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];
}