【问题标题】:Writing JEST unit test for a simple function为一个简单的函数编写 JEST 单元测试
【发布时间】:2017-11-21 06:45:03
【问题描述】:

基本上这是我的反应代码

    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 编写测试用例。

【问题讨论】:

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


    【解决方案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

    【讨论】:

      猜你喜欢
      • 2019-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-06
      • 2022-01-11
      • 1970-01-01
      • 2022-08-23
      • 1970-01-01
      相关资源
      最近更新 更多