Goal
Giới thiệu Reactjs Testing Framework: Jest
Testing Framework
Phần TestUtils đã cho bạn khái niệm về các phương thức test React Component, bây giờ chúng ta sẽ thử ứng dụng Testing Framework.
Mặc dù khi tìm hiểu các bài viết về Reactjs Testing Framework, tôi có thấy nhiều ý kiến cho rằng Jest không bằng các Javascript Testing Framework khác như Mocha hay Karma, nhưng vì theo tôi đang viết theo series về Reactjs nên ở đây tôi sẽ tìm hiểu và giới thiệu Jest.
Jest
From Offical Page:
Jest provides you with multiple layers on top of Jasmine:
1.Automatically finds tests to execute in your repo
2.Automatically mocks dependencies for you when running your tests
3.Allows you to test asynchronous code synchronously
4.Runs your tests with a fake DOM implementation (via jsdom) so that your tests can run on the command line
5.Runs tests in parallel processes so that they finish sooner
Mock trong Jest
Tôi nghĩ tôi cần giải thích sơ qua Mock trong Jest.
Mock có nghĩa là làm giả, làm nhái. Để làm quen từ ngữ tôi sẽ dùng từ mock với nghĩa trên.Jest có thể mock các modules, functions, component thành một “mocked version” rồi sử dụng các Mock này mà không phải đụng đến “real version” của nó.
-> should always return a mocked version of the specified module from require() (e.g. that it should never return the real module).
-> should never return a mocked version of the specified module from require() (e.g. that it should always return the real module)
Getting Started:
Tôi sẽ thử test cái source code trong bài trước là Reusable Component.
Setup
Trước mắt, cần setup source code như sau:
- Copy toàn bộ thư mục “material-ui-component” thành thư mục “testing”.
- Tách source code trong file main.jsx thành các Component như member.jsx.
- Tạo thư mục test để chứa các file test
Tạo
npm test
command:Trong thư mục “testing”:
npm init
để tạo file package.json (File này sẽ có vai trò chứa những config cho Jest sau này), khi init nhớ nhập ‘jest’ cho line
test command: jest
JSX transformer: vì source code “material-ui-component” viết theo syntax JSX nên khi test ta cũng cần chuyển đổi JSX thành JS, trong file package.json ta thêm đoạn code sau:
"jest": { "scriptPreprocessor": "preprocessor.js" }
Và tạo file preprocessor.js
var ReactTools = require('react-tools');
module.exports = {
process: function(src) {
return ReactTools.transform(src, {harmony: true});
}
};
Bạn cũng cần install react-tools
.
6. Remove Mock
Trong file package.json
, ta thêm như sau để chỉ định việc không mock tất cả các node module
"jest": {
"scriptPreprocessor": "preprocessor.js",
"unmockedModulePathPatterns": ["node_modules/react"]
},
Tạo Unit Test cho Component member
__test__/member-test.js
jest.dontMock('../member.jsx');
var React = require('react/addons');
var Member= require('../member.jsx');
var TestUtils = React.addons.TestUtils;
describe('Member component', function() {
it('set name for member', function() {
// Render a member with name is Foo
var memberFoo = TestUtils.renderIntoDocument(
<Member name="Foo" />
);
// Verify that it's name is Foo
var memberName = TestUtils.findRenderedComponentWithType(memberFoo, Member);
expect(memberName.getDOMNode().textContent).toEqual('Foo');
});
});
Problem:
Với version nodejs tôi đang dùng là v0.11.14 thì khi chạy sample mẫu từ Jest thì OK, tuy nhiên khi thử test với Component member.jsx
thì bị lỗi là: “Error: Worker process exited before responding! exit code: null, exit signal: SIGSEGV stderr:”. Và dường như đây là 1 known issue
https://github.com/facebook/jest/issues/243
Và tôi cũng đã thử với version mới nhất của nodejs tại thời điểm này là là v0.12.5 nhưng cũng không khá hơn.
Note: tôi đang dùng nvm để quản lý version của nodejs. Nhờ nó tôi dễ dàng upgrade cũng như downgrade version của nodejs.
Cũng theo một comment trên https://github.com/facebook/jest/issues/243 , tôi thử dùng nodejs 0.10 và thử retest thì OK:
#Chuyển sang node v0.10
nvm use 0.10
#Rebuild all dependencies
npm rebuild
#Run test
npm test
Bạn có thể thử thay đổi ‘Foo’ trong .toEqual('Foo')
thành ‘Fool’ và thử chạy lại câu lệnh npm test
, nó sẽ báo kết quả Fail.
Source code demo cho ví dụ trên:
https://github.com/phungnc/reactjs-tut-demo/tree/feature/jest/jest
Tôi cũng thử viết thêm một vài test cho member component vào file __test__/member-test.js
:
https://github.com/phungnc/reactjs-tut-demo/blob/feature/jest_testing_more_complex/jest/member.jsx