search

Home  >  Q&A  >  body text

node.js - mocha testing ajax asynchronous request action error

When mocha tests an asynchronous action with an ajax request, the console reports a Cannot read property 'document' of undefined error. The code is as follows:
/counter.js/

import $ from "../componet/jquery.min.js"
export const CHANGE_USERNAME_ERROR = 'CHANGE_USERNAME_ERROR'

export function checkUsername (name) {
  return (dispatch) => {
    $.get('/check', {username: name}, (msg) => {
      dispatch({
        type: CHANGE_USERNAME_ERROR,
        error: msg
      })
    })
  }
}

/counter.test.js/

import { expect } from 'chai'
import sinon from 'sinon'
import * as Actions from '../../public/javascripts/actions/counter';
describe('actions/register', () => {
  let actions
  let dispatchSpy
  let getStateSpy
  let xhr
  let requests

  beforeEach(function() {
    actions = []
    dispatchSpy = sinon.spy(action => {
      actions.push(action)
    })
    
    xhr = sinon.useFakeXMLHttpRequest()
    requests = []
    xhr.onCreate = function(xhr) {
      requests.push(xhr);
    };
  })

  afterEach(function() {
    xhr.restore();
  });

  describe('Action: checkUsername', () => {   
    it('Should call dispatch CHANGE_USERNAME_ERROR.', () => {
      Actions.checkUsername('foo@bar')(dispatchSpy)      
      const body = '不能含有特殊字符'
      
      // 手动设置 ajax response      
      requests[0].respond(200, {'Content-Type': 'text/plain'}, body)  
          
      expect(actions[0]).to.have.property('type', Actions. CHANGE_USERNAME_ERROR)
      expect(actions[0]).to.have.property('error', '不能含有特殊字符')
    }) 
  })
})
报的是jquery.min.js中的错误,我是在控制台跑的mocha,麻烦各位给参谋参谋!拜谢
高洛峰高洛峰2830 days ago905

reply all(1)I'll reply

  • 迷茫

    迷茫2017-05-16 13:41:34

    First of all, you don’t have a DOM environment here, you need jsdom to simulate a DOM environment. Second, even if you simulate the DOM environment, you cannot call AJAX, because for your test, there is no server at all that can make requests for you, unless you simulate a mock server here, which I have not tried.

    reply
    0
  • Cancelreply