Как имитировать возвращаемое значение в другом файле?

Я тестирую файл действий в потоке с шуткой и, кажется, не могу понять, как имитировать в нем возвращаемое значение.

Когда я указываю возвращаемое значение (см. Код ниже) для фиктивного модуля в моем тестовом файле, все работает нормально, но когда эта же функция вызывается в модуле, который я тестирую, он оказывается неопределенным.

#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 и автоматического имитации заключается в том, что установка mockReturnValue в имитируемом модуле (в данном случае GameStore) применяется на протяжении всего теста, а не только внутри тестового файла.

Как бы я мог издеваться над методом GameStore.getGame (), чтобы он также применялся в MissionActions.js?


person Andrew Cross    schedule 22.04.2015    source источник


Ответы (1)


Я уже сталкивался с этим раньше.

Чтобы исправить это, в вашем тесте переместите требуемый GameStore в блок beforeEach.

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

Я не уверен на 100% в этом, но я считаю, что mockRegistry ограничена для каждого теста. Поэтому, когда вам нужно, чтобы он находился внутри блока описания, он издевается над ним, как и следовало ожидать. Затем, когда вам требуется MissionActions внутри beforeEach, он запускает новую область. Таким образом, он издевается над MissionActions, затем начинает имитировать его зависимости и делает совершенно новый имитатор GameStore.

person Crob    schedule 22.04.2015
comment
Вау, большое спасибо. Не могу поверить, что это было так просто. - person Andrew Cross; 22.04.2015
comment
нет, это было не просто. и у меня была такая же проблема в моих тестах. Если вы используете babel с импортом, это убийство. На мой взгляд, в документации Jest не хватает многих деталей. в любом случае @Crob Хороший ответ. - person Mihai; 12.10.2016