javascript - 使用 Jasmine 模拟 firebase 调用

标签 javascript unit-testing jasmine firebase-realtime-database spyon

我正在寻找对 firebase 数据库的 spy 调用。我有一个包含 firebase 调用的 FireFunc 文件。但是,当我转到spyOn 检查方法时,它返回常规结果。这是怎么回事?

var FireFunc = require("../js/services-fb-functions.js");

describe('Firebase Testing Suite', function() {
    var firebase;
    var testPath;
    var testResult = {};

    beforeAll(function() {
        var firebaseFunctions = ['check']
        firebase = jasmine.createSpyObj('firebase', firebaseFunctions)

        firebase.check.and.callFake(function() {
            return 2
        });
   });

   describe('check', function() {
    it('is working?', function() {
        var x = FireFunc.zset()
        expect(x).toBe(3); // THIS IS RETURNING 1... which means the spyOn doesn't work for me !
    });
});

这是我的代码(js/services-fb-functions.js)

var firebase = {};
firebase.check = function() {
    return 1;
}

module.exports = {
    zset: function() {
        return firebase.check();
    }
}

最佳答案

问题是您尚未向测试对象提供 firebase 对象的模拟版本。 js/services-fb-functions.js 中存在的 firebase 对象纯粹是内部的,不会以任何方式公开用于测试。好的做法通常是使用 dependency injection用于提供您希望在测试期间模拟的内部对象。我已经稍微调整了您的代码以与 JSFiddle 和 Jasmine 1.3 一起使用,所以请原谅我有限的 JS 技能(肯定有更优雅的方式来公开内部对象),但是这个 JSFiddle 应该证明我的观点:Simple Jasmine example using spies

关于javascript - 使用 Jasmine 模拟 firebase 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37825370/

相关文章:

javascript - 有条件的 ng-click on AngularJS

javascript - Ext js 4.2.3 beta - Safari 上的离线应用程序区域设置

android - 测试 Activity 是否已使用 FLAG_ACTIVITY_CLEAR_TOP 启动

java - 为什么 Java 将包访问设置为默认?

unit-testing - 让 Mocha 测试显示实际错误

angular - 你的一些测试做了一个完整的页面重新加载

javascript - node.js 在函数中保留局部变量,为什么?

IE8 中的 JavaScript 事件原型(prototype)

angularjs - 如何模拟 $window 来单元测试 AngularJS 服务?

ajax - 如何使用 Jest 测试 React 渲染的异步数据?