For example, let's rewire the dependencies of this sample module.
/* loggingReader.js */
importfsfrom'fs';
importloggerfrom'./logger';
exportdefault{
readFile(filePath){
logger.log(`Read ${filePath}`);
returnfs.readFileSync(filePath);
}
}
Without babel-rewire-wrapper
importreaderfrom'./loggingReader';
reader.__Rewire__('fs',{
readFileSync:filePath=>`Content of ${filePath}.`
});
reader.__Rewire__('logger',{
log:()=>{}
});
assert.equal(reader.readFile(filePath),`Content of ${filePath}.`);
reader.__ResetDependency__('fs');
reader.__ResetDependency__('logger');
With babel-rewire-wrapper
importreaderfrom'./loggingReader';
importrewirefrom'babel-rewire-wrapper';
rewire()
.use(reader,{
fs:{
readFileSync:filePath=>`Content of ${filePath}.`
},
logger:{
log:()=>{}
}
})
.run(()=>{
// While running this callback, all dependencies are rewired.
assert.equal(reader.readFile(filePath),`Content of ${filePath}.`)
});
// After the running, all dependencies are reset.
When you pass a callback to run() method, rewire() injects mocks and run the callback.
All dependencies will be reset automatically after the running (even if some error occurred).
Rewire several modules
You can chain use() methods.
rewire()
.use(reader,{
fs:{
readFileSync:filePath=>`Content of ${filePath}.`
},
logger:{
log:()=>{}
}
})
.use(greeter,{
greet:()=>'Hi'
})
.run(()=>{
assert.equal(reader.readFile(filePath),`Content of ${filePath}.`);
assert.equal(greeter.greet(),'Hi');
});
Run async function
When running an async function, you have to return Promise
so that the dependencies will be reset correctly after running.
importreaderfrom'./loggingReader';
importrewirefrom'babel-rewire-wrapper';
rewire()
.use(reader,{
fs:{
readFileSync:filePath=>`Content of ${filePath}.`
},
logger:{
log:()=>{}
}
})
.run(()=>{
returnfetchFilePath()
.then(filePath=>{
assert.equal(reader.readFile(filePath),`Content of ${filePath}.`)
});
})
.then(...);
Call rewiring methods separately
You can also inject mocks and reset dependencies explicitly.
Following is an example used with mocha.