编写JEST单元测试以获得简单的功能

时间:2017-11-21 06:45:03

标签: javascript reactjs unit-testing react-native jestjs

基本上这是我的反应代码

    getDetails: function () {
        var apiUrl = ConfigStore.get('api')
        request
            .get(apiUrl)
            .set('X-Auth-Token', AuthStore.jwt)
            .set('Accept', 'application/json')
            .end(function (err, response) {
                if (!err) {
                    if(response.text.indexOf("string") > -1){
                        this.dispatch('COMMAND1', response);
                    }
                    else {
                        this.dispatch('COMMAND2', response.body.options);
                    }
                }
                else {
                    this.dispatch('COMMAND3', response && response.body);
                }
            }.bind(this));
    }

我为COMMAND1

的上述函数编写了一个单元测试
    it('Getting Latest Details', () => {
    let eventSpy = sinon.spy();
        require('superagent').__setMockResponse({
            body: {               
                firstName: 'blah',
                lastName: 'm ',
                username: 'blah',
                text: {
                    text : jest.fn()
                }               
            }
        }); 
        let dispatchListener = AppDispatcher.register((payload) => {
            if (payload.action.type === 'COMMAND1') {
                eventSpy(payload.action.payload);               
            }
        });     

        AuthStore.loggedIn = jest.genMockFunction().mockReturnValue(true);
        AuthStore.getToken = jest.genMockFunction().mockReturnValue('545r5e45er4e5r.erereere');
        MedsAlertsActions.getDetails();
        expect(eventSpy.called).toBe(true);
        dispatch('COMMAND1', data);
        AppDispatcher.unregister(dispatchListener);
});   

当我跑步时

npm test myfile.test

我正在

TypeError: Cannot read property 'indexOf' of undefined
  1. 那么如何将indexOf响应放入我的body?如何解决类型错误
  2. 如何编写command2command3的测试用例。

1 个答案:

答案 0 :(得分:1)

我可以看到你正在使用 sinon 。您可以在其中创建一个沙箱和一个虚假服务器,它返回每个测试用例的预期响应。像这样的东西,例如:

describe('your test suite', () => {
  let sandbox;
  let server;

  beforeAll(() => {
    sandbox = sinon.sandbox.create();
    server = sandbox.useFakeServer();
  });

  it('Calls COMMAND1', () => {

    //Sinon takes some ms to respond, so you have to use a setTimeout
    setTimeout(
      () => server.respond([200, { 'Content-Type': 'text/html' }, 'some string']),
      0
      );

    // Put here your assertions
  });


});

您可以在需要时使用server.restore()sandbox.restore()清除每一个。此外,您还可以访问使用sandbox.requests

发出的请求

这是一篇很棒的帖子,可以帮到你:https://medium.com/@srph/axios-easily-test-requests-f04caf49e057,它是关于axios的,但你可以用同样的方式实现它。

此外,您可以在沙盒的官方sinon文档中了解更多信息:http://sinonjs.org/releases/v1.17.7/sandbox