jest-fixture-injection v0.3.2
jest-fixture-injection
Jest extension to use fixture-injection.
Note: jest-fixture-injection is still in alpha stage.
fixture-injection is a test helper tool for Jest and Jasmine to inject fixtures into test functions and beforeAll() by leveraging dependency injection.
- Test functions use fixtures by declaring the fixture names as arguments.
- Fixtures can use other fixtures and fixture-injection manages the dependencies.
- Fixtures can have asynchronous setup and teardown in it.
- Global fixtures are instantiated in the global scope and shared by multiple test suites (independent workers in Jest) and used as a singleton, whereas local fixtures are instantiated in each local scope.
Usage
Define fixtures in __fixtures__.ts:
import { Provide } from 'jest-fixture-injection'
// Example 1) Simple value
export const foo = 'FOO'
// Example 2) Fixture function to provide a value which requires another fixture `foo`
export const bar = (foo: string) => `BAR(${foo})`
// Example 3) Asynchronous fixture function to provide a value
export const baz = async (provide: Provide, bar: string) => { // requires another fixture `bar`
// Write setup code here
await provide(`BAZ(${bar}`) // provide the value
// `await` above waits until the context (test case or suite) finishes
// Write teardown code here
}Use fixtures in test functions or beforeAll():
describe('My test suite', () => {
let fixtures: { foo?: string } = {}
beforeAll((foo: string) => { // Inject fixtures to *a suite* by beforeAll()
fixtures.foo = foo
})
test('with fixtures', (bar: string, baz: string) => { // Inject fixtures to *a test case*
// bar and baz are initialized just before this block
const { foo } = fixtures // Get fixtures from the suite
expect(foo).toEqual('FOO')
expect(bar).toEqual('BAR(FOO)')
expect(baz).toEqual('BAZ(BAR(FOO))')
// bar and baz are released just after this block
})
// foo is released by hidden afterAll() of this block automatically
})Set environment variable FI_LOGGING=true to print the log.
FI_LOGGING=true jestPrerequisite
- Node.js >= 10
- Jest >= 24
Install/Setup
Basic Setup
Install jest-fixture-injection into your NPM project:
$ npm install --dev jest-fixture-injectionOr, if you use Yarn:
$ yarn add --dev jest-fixture-injectionDefine test command in package.json:
{
"scripts": {
"test": "jest"
}
}Create jest.config.js. You can choose jsdom or node as the test
environment:
module.exports = {
preset: 'jest-fixture-injection',
testEnvironment: 'jest-fixture-injection/dist/jsdom'
}Or,
module.exports = {
preset: 'jest-fixture-injection',
testEnvironment: 'jest-fixture-injection/dist/node'
}Create fixture-injection.config.js:
module.exports = {
fixtures: '<rootDir>/tests/__fixtures__.ts',
globalFixtures: '<rootDir>/tests/__global_fixtures__.ts',
ipc: {
appspace: 'my-app'
}
}- Create your local fixtures in
tests/__fixures__.ts - Create your global fixtures in
tests/__global_fixtures__.ts - Set
ipc.appspace- It must be unique when you use jest-fixture-injection in multiple processes at a time
- It will be used as the socket file name prefix (e.g., socket file:
/tmp/my-app-fixutre-injection-server)
- You can set other IPC options; See node-ipc/IPC Config
Create React App
Because Create React App does not allow Jest to read jest.config.js, you have to specify individual command-line options: --env, --globalSetup and --globalTeardown.
package.json:
{
"scripts": {
"test": "react-scripts test --env=jest-fixture-injection/dist/jsdom --globalSetup=jest-fixture-injection/dist/setup --globalTeardown=jest-fixture-injection/dist/teardown"
}
}Create React App enables @types/jest by default and it conflicts with type definitions of jest-fixture-injection. Set tsconfig.json -> compilerOptions -> types manually to exclude @types/jest from it.
tsconfig.json:
{
"compilerOptions": {
"types": ["node", "react", "react-dom", "jest-fixture-injection"]
}
}Limitations
done()is not available to define asynchronous tests; Use async/await instead- Don't use transpiler plugins/settings which modify function arguments such as transform-async-to-generator plugin for Babel because fixture-injection parses the argument names at runtime to determine which fixtures to inject.
Examples
- jest-fixture-injection-example
- Using jest-fixture-injection with a simple Jest config
- jest-fixture-injection-example-react
- Using jest-fixture-injection in a React project generated by Create React App