簡體   English   中英

編寫JEST單元測試以實現簡單功能

[英]Writing JEST unit test for a simple function

基本上這是我的反應代碼

    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編寫測試用例。

我可以看到您正在使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM