reactjs - 如何模拟另一个文件中的返回值?

标签 reactjs reactjs-flux jestjs

我正在用 Jest 测试一个不断变化的操作文件,但似乎无法弄清楚如何模拟其中的返回值。

当我在测试文件中为模拟模块指定返回值(参见下面的代码)时,一切正常,但是当在我正在测试的模块中调用相同的函数时,它会显示为未定义。

#MissionActions-test.js

jest.dontMock('../MissionActions');
describe('MissionActions', function() {
    var GameStore = require(root + 'stores/game/GameStore');
    var MissionActions;

    beforeEach(function() {
        MissionActions = require('../MissionActions');
    });

    it('should...', function() {
        GameStore.getGame.mockReturnValue({test: "test"});
        console.log(GameStore.getGame()); // prints {test : "test"}
        MissionActions.addMissionFromBank();
    });
});

还有正在测试的 MissionActions.js。

# MissionActions.js
var GameStore = require('../../stores/game/GameStore');

var MissionActions = {
    addMissionFromBank: function(bankMission) {
        var game = GameStore.getGame();
        console.log(game); // prints undefined
    }
}

module.exports = MissionActions;

我对API和自动模拟的解释是,在模拟模块(在本例中为GameStore)上设置mockReturnValue适用于整个测试,而不仅仅是在测试文件中。

我将如何模拟 GameStore.getGame() 方法,以便它也适用于 MissionActions.js 中?

最佳答案

我以前也遇到过这种情况。

修复方法是,在您的测试中,将 GameStore 要求移至 beforeEach block 中。

beforeEach(function() {
    MissionActions = require('../MissionActions');
    GameStore = require(root + 'stores/game/GameStore');
});

我对此不是100%确定,但我相信mockRegistry是按测试确定范围的。因此,当您在描述 block 内需要它时,它会像您期望的那样模拟它。然后,当您在 beforeEach 内需要 MissionActions 时,它会启动一个新范围。因此它模拟 MissionActions,然后开始模拟它的依赖项并对 GameStore 进行全新的模拟。

关于reactjs - 如何模拟另一个文件中的返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29801778/

相关文章:

javascript - 如何使用 Jest 检查元素是否可见?

typescript - 在 Jest 测试中调用 new class() 后没有创建新的类实例

reactjs - 如何避免 react 日期选择器日历在上一个文本框的选项卡按键上打开

javascript - Axios Post 登录请求显示待处理状态?

javascript - React Flux 存储和硬刷新

javascript - React setState 和 Flux Action 更新

jestjs - 如何使用 Jest 和 Prettier 3.0.0 测试内联快照?

javascript - 带有 history.push 的 React-router 嵌套路由

javascript - 如何将 React 组件推送到数组?

javascript - 为什么 addChangeListener 应该在 componentDidMount 而不是 componentWillMount?