在react的getInitialState中模拟异步请求

时间:2017-11-30 10:51:36

标签: javascript reactjs unit-testing enzyme

当我创建这个问题时,我怀疑的是如何使用mocha / enzyme / chai / sinon测试异步请求。
我确信有不同的方法,但可能的方法是使用手工函数来模拟它,返回适当的值(检查答案的详细信息)。
我的getInitialState方法是这样的:

getInitialState: function() {
    var me = this;
    var documentData = null;
    var promise = me.getDocuments();

    promise.then(function(value) {
        var documents = value.map(function(obj) {
            return Object.keys(obj).sort().map(function(key) { 
                return obj[key];
            });
        });

        documentData = documents;
    });

    return ({
        cd: false
    });
},

返回promise的getDocuments()函数是:

getDocuments: function() {
    var deferred = when.defer();

    Collection.fetch({cd: workspaceInfo.getCD()}).then(
        function(results) {
            deferred.resolve(results);
        },
        deferred.reject
    );

    return deferred.promise;
},

我如何成功地测试它? 我是否必须模拟getInitialState方法本身? (即便可能)
或者只是带有一些可预测返回值的getDocuments函数?
在此先感谢,任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

我通过要求Collection(这是一个从数据库中带来一些值的rest API)解决了这个问题

var Collection = require("path/to/my/collection/Collection");  

之后,我在我的getDefaultProps()方法中使用它:

getDefaultProps() {
        return {
            Collection: new Collection()
        };
    },

这反过来使我能够编写初始化模拟集合的测试(fileDataResponse是带有一些数据的JSON):

var CollectionMock= {
    fetch: () => {
        return {
            then: callback => callback(fileDataResponse)
        };
    }
};  

然后在我的测试中使用它:

it("should open the modal without a loaded configuration", function() {
    var instance, wrapper;

    wrapper = mount(
        <DocumentPreview 
        Collection={CollectionMock}/>
    );

    instance = wrapper.component.getInstance();
    instance.openModal();
    expect(wrapper.find('#MockedTest' + 'docOid251085').exists()).to.equal(true);

    wrapper.unmount();
});