如何模拟另一个文件中的返回值?
Posted
技术标签:
【中文标题】如何模拟另一个文件中的返回值?【英文标题】:How to mock return value in another file? 【发布时间】:2015-06-30 08:37:56 【问题描述】:我正在测试一个不断变化的动作文件,但似乎无法弄清楚如何在其中模拟返回值。
当我在我的测试文件中为一个模拟模块指定返回值(见下面的代码)时,一切正常,但是当我正在测试的模块中调用相同的函数时,它出现为未定义。
#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?
【问题讨论】:
【参考方案1】:我以前也遇到过这种情况。
解决方法是,在您的测试中,将 GameStore 要求移到 beforeEach 块中。
beforeEach(function()
MissionActions = require('../MissionActions');
GameStore = require(root + 'stores/game/GameStore');
);
我对此不是 100% 确定,但我相信 mockRegistry 是每个测试的范围。因此,当您在 describe 块内需要它时,它会像您期望的那样模拟它。然后,当您在 beforeEach 中需要 MissionActions 时,它会启动一个新范围。所以它模拟了 MissionActions,然后开始模拟它的依赖项,并对 GameStore 进行全新的模拟。
【讨论】:
哇,非常感谢。我不敢相信事情就这么简单。 不,这并不简单。我在测试中遇到了同样的问题。如果您将 babel 与导入一起使用,那么这些东西就是一个杀手。在我看来,Jest 在文档中缺乏很多细节。无论如何@Crob很好的回应。以上是关于如何模拟另一个文件中的返回值?的主要内容,如果未能解决你的问题,请参考以下文章
如何从小部件的函数返回值,并将其传递给 Tkinter,Python 中的另一个小部件的函数
如何从widget的函数返回值,并将其传递给Tkinter,Python中的另一个小部件的函数