常量不适用于Actions中的jest测试

时间:2015-05-05 15:09:23

标签: javascript facebook reactjs jestjs

当我在下面运行navAction-test.js时出现以下错误:TypeError:无法读取未定义的属性“DATA_LOADED”

据我所知,constant.DATA_LOADED是未定义的,我猜jest正在嘲笑它,因此常量是未定义的,我已经尝试了下一步我能找到的所有东西,但它仍未定义。

是否有人可以提供帮助。我真的很感激。

navAction.js:

var dispatcher = require('../dispatcher/AppDispatcher');
var constants = require('../constants/constants');

module.exports = {

    load: function() {
    def = $.ajax({
        url: 'http://api.facebook.com/',
        data: {},
        success: function (data, textStatus, jqXHR) {
            dispatcher.dispatch({type: constants.DATA_LOADED, data: data});
        }
    });
    }
}

navAction-test.js:

jest.dontMock('../navAction.js');

describe('Tests NavigationCollectionActionCreators', function() {

    var $;
    var dispatcher;
    var navAction;

    beforeEach(function() {
    $ = require('jquery');
    dispatcher = require('../../dispatcher/AppDispatcher');
    navAction  = require('../navAction.js');
    });

    it('tests calls $.ajax & dispatcher ', function () {
    navAction.load();
    $.ajax.mock.calls[0][0].success({body: {header: {items: [{name: 'The name', link: 'http://www.facebook.com'}]}}});

    expect(dispatcher.dispatch).toBeCalledWith({type: 'DATA_LOADED', data: [{name: 'The name', link: 'http://www.timeout.com'}]});
    });

});

//constants.js
var keyMirror = require('keymirror');

module.exports = keyMirror({
    DATA_LOADED: null,
});

更新:

我通过将以下内容添加到navAction-test.js来实现此目的:

var constants = {
    DATA_LOADED: 'DATA_LOADED',
    DATA_NOT_LOADED: 'DATA_NOT_LOADED'
};
jest.setMock('../../constants/constants', constants);

这是正确的做法吗?

1 个答案:

答案 0 :(得分:1)

添加测试:

jest.dontMock('../constants/constants');

如果您根本不想使用自动锁定,则可以删除所有jest.dontMock并改为放置:

jest.autoMockOff();

我认为你解决问题的方法(在底部的更新中)是不合适的,因为它违反了DRY(不要重复自己)。添加另一个动作常量会发生什么?现在你必须记住在测试中添加它。这是有问题的。