在Sinon.fakeServer响应model.fetch

时间:2018-06-18 18:18:23

标签: javascript asynchronous jestjs sinon synchronous

我正在尝试为我们的Backbone应用程序编写测试套件。我们使用Jest作为测试框架,使用Sinon进行服务器模拟。

示例测试类似于

device.test.js

describe('API integration', ()=>{
        let response = {"data": {
                "attributes": {
                    "created_at": "2018-06-14T07:05:14.919Z",
                },
                "id": "234",
                "type": "device"
         }};

        let server = sinon.fakeServer.create();
        afterAll(() => {
            server.restore();
        });

        let device = new Device({
            id: '234'
            created_at: null,
            agent_code: null,
            device_code: null,
        });

        server.respondWith('GET',
            'api/device/234',
            [200, {"Content-Type": "application/json"},
            JSON.stringify(response)]);

        device.fetch();
        server.respond();
        it('fetches to the right URL', ()=>{
            // these both pass
            expect(server.requests[0].method === 'GET');
            expect(server.requests[0].url === 'api/device/234');
        });
        it('updates its fields properly after a fetch', ()=>{
           // this test fails
           expect(device.get('created_at')).toBe(response.attributes.created_at);

        });           
    });

我正在使用this article作为如何使用sinon测试骨干模型的示例(向falseserver一起滚动到底部使用)以及使用sinon fakeserver docs

根据我读过的内容,server.respond()应该评估所有异步请求,因此模型应该同步更新。也就是说,我的期望是在device之后对server.respond的任何引用应该指的是获取后device模型。我的期望未得到满足 - 在致电server.respond()后,device.get('created_at')仍为undefined。当我们的应用程序运行时,这不是生产中的情况。

以防万一,我试图将测试投放到{success: function(){}}回调中,以及.then.done,但测试不会运行,也不会console.log()或任何其他调试工作。

如何使用Sinon.fakeServer在Jest中测试Backbone.model.fetch()等异步方法?

编辑:This answer让我想知道是否parse甚至被调用 - 也许我正在异常地构造我的返回数据。确实正在调用Parse,所以现在我怀疑这不是异步问题,而是我在response对象中构造数据的方式。

1 个答案:

答案 0 :(得分:0)

答案是我的模型的id属性与API_MOCKS帮助文件中的响应对象的id属性不匹配。它与asynch无关。