【发布时间】:2017-08-29 09:12:44
【问题描述】:
我有一个基于 mocha 的测试,它在我的 React 组件的基于 jsdom 的酶测试中在我的 onChange 处理程序之前完成,尽管该处理程序是使用 babel+ES2017 同步的。如果我做一个 1ms 的setTimeout() 来输入我的expect() 电话;测试通过。
只是想知道故障在哪里?我敢肯定这里有一些简单的概念我没有考虑。我在想 jsdom 或酶不会等待事件处理程序完成?使用fetch-mock 模拟fetch() 的时间长度加剧了一个问题(因为它通常是异步的)。
没有setTimeout()、sinon或lolex是否可以解决,如果不能; simon / lolex 可以吗?
我希望明天我会重构它以避免在测试中模拟 fetch()。
测试输出
</div>
1) flashes a nice message upon success
Success now!!
End of function now.
10 passing (4s)
1 failing
1) <Signup /> flashes a nice message upon success:
Uncaught AssertionError: expected { Object (root, unrendered, ...) } to have a length of 1 but got 0
at test/integration/jsx/components/signup.test.js:38:54
at _combinedTickCallback (internal/process/next_tick.js:67:7)
at process._tickDomainCallback (internal/process/next_tick.js:122:9)
引导
require('babel-register')();
require('babel-polyfill');
...
var jsdom = require('jsdom').jsdom;
var exposedProperties = ['window', 'navigator', 'document'];
global.document = jsdom('');
global.window = document.defaultView;
global.FormData = document.defaultView.FormData;
Object.keys(document.defaultView).forEach((property) => {
if (typeof global[property] === 'undefined') {
exposedProperties.push(property);
global[property] = document.defaultView[property];
}
});
global.navigator = {
userAgent: 'node.js'
};
documentRef = document;
测试
import React from 'react';
import { expect } from 'chai';
import { shallow, mount, render } from 'enzyme';
import Signup from '../../../../assets/js/components/signup.jsx';
import fetchMock from 'fetch-mock';
import sinon from 'sinon';
import 'isomorphic-fetch';
...
it("flashes a nice message upon success", function(){
fetchMock.mock("*", {body: {}});
const wrapper = shallow(<Signup />);
wrapper.find('#email').simulate('change', {target: {id: 'email', value: validUser.email}});
const signupEvent = {preventDefault: sinon.spy()};
wrapper.find('#signupForm').simulate('submit', signupEvent);
wrapper.update();
console.log(wrapper.debug());
expect(signupEvent.preventDefault.calledOnce).to.be.true;
expect(wrapper.find('.alert-success')).to.have.length(1);
expect(wrapper.find('.alert-success').text()).to.contain('Your sign up was successful!');
fetchMock.restore();
});
组件
async handleSubmit(e) {
e.preventDefault();
this.setState({ type: 'info', message: 'Sending...', shouldValidateForm: true });
let form = new FormData(this.form);
let response;
let responseJson = {};
try {
response = await fetch("/signup", {
method: "POST",
body: form
});
responseJson = await response.json();
if(!response.ok){
throw new Error("There was a non networking error. ");
}
this.setState({ type: 'success', message: 'Your sign up was successful!' });
console.log("Success now!!");
} catch(err) {
this.setState({ type: 'danger', message: "There was a technical problem. "});
}
console.log("End of function now. ");
}
...
<form method="POST" onSubmit={this.handleSubmit} ref={(form) => {this.form = form;} } id="signupForm">
【问题讨论】:
标签: javascript reactjs mocha.js enzyme jsdom