2016-08-21 42 views
13

我用火力3.3.0,我想用signInWithEmailAndPassword功能在我的摩卡单元测试,但我得到的错误认证/网络请求失败摩卡单元测试火力地堡应用

Unhandled rejection Error: A network error (such as timeout, interrupted connection or unreachable host) has occurred. 

测试.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" 
    } 
+0

您将需要显示“FIREBASE_API_REF”引用的内容。此外,代码还存在其他问题:'done'永远不会被调用;决不会被称为;你不需要创建自己的承诺 - 这是一个[反模式](https://github.com/petkaantonov/bluebird/wiki/Promise-anti-patterns#the-deferred-anti-pattern)。 – cartant

+0

@cartant感谢您的回复,这不是'before'函数的完整部分。我只是想显示一段代码,我不能调用'signInWithEmailAndPassword'函数。请看我编辑的问题。 – Matt

+0

我认为这个问题的部分问题是不清楚你在问什么,并且你已经剪掉了部分测试代码 - “describe”和“it”调用在哪里?另外,您还没有指定如何运行测试:在使用Karma的浏览器中;或者在Node中使用mocha命令? – cartant

回答

1

当你说:“我想用signInWithEmailAndPassword功能在我的摩卡单元测试”那么我会告诉你,“为什么”?

您是否试图通过测试其验证服务是否有效来帮助Firebase团队?这很好,但如果你想测试你的应用程序,那么你应该在单元测试中调用firebase。您真正想要检查的是,响应返回时运行的代码中的响应类似于Firebase响应的响应,由您的应用程序正确处理。

如果我写一个测试为了这个,我会使用兴农库摩卡和创建一个调用不同的函数返回一些数据的存根,而不是实际调用到火力地堡任务:

这说明语法的兴农存根:

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" 
    } 
}); 
+0

嘿吉姆 - 我在考虑如何使用数据库的摩卡测试来测试Firebase安全规则。为此登录用户将非常有用。 –

+0

嗯,你可以做一些像集成测试一样的验证安全规则,而不依赖于你的前端UI。在您的“快乐案例”测试中,使用虚拟用户帐户登录,尝试访问数据库对象,并断言您可以获取对象。然后,您可以进行另一项测试,作为无权访问的虚拟用户登录。对他来说,你可以断言对DB对象的请求被拒绝(它返回null或请求失败等)。祝你好运! :) – Jim

1

可能你已经不再使用它了,但不是创建一个存根,而是使用spyOn,它的功能就像一个魅力。

enter image description here

1

对于任何人面对这个问题,我能够确定从jsdom全球XMLHttpRequest对象问题就来了。我可以通过使用此代码来设置我的全局变量来摆脱错误:

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