1つの3番目のlibを使用してデータをフェッチする1つのJSをテストしたいので、その実装にjest mockを使用しています。テストで直接呼び出すと機能します。ただし、ソースコードで使用すると機能しません。
これがコードです
//Source implementation
var reference = require('./reference');
module.exports = {
getResult: function() {
return reference.result();
}
};
//Test code
jest.dontMock('./foo');
jest.dontMock('console');
describe('descirbe', function() {
var foo = require('./foo');
it('should ', function() {
var reference = require('./reference');
reference.result.mockImplementation(function (a, b, c) {
return '123'
});
console.log(foo.getResult()); // undefined
console.log(reference.result()); // 123
});
});
Requireの順序が間違っています。モックを設定する前に./foo
が必要な場合、reference
は、Jestの自動モッキングに従ってfoo
s reference
が未定義になります。
jest.dontMock('./foo');
describe('describe', function() {
it('should ', function () {
var reference = require('./reference');
reference.result.mockImplementation(function (a, b, c) {
return '123';
});
var foo = require('./foo');
console.log('ferr', foo.getResult()); // ferr 123
});
});
この線
var foo = require('./foo');
describe
で評価され、foo
に保存されます。
その後、it
ブロックでそれをモックアウトしますが、これは古い参照foo
には適用されません。
foo
呼び出しの後にmockImplementation
を置くと、エラーが修正されます。
//Test code
jest.dontMock('./foo');
jest.dontMock('console');
describe('describe', function() {
it('should ', function() {
var reference = require('./reference');
reference.result.mockImplementation(function (a, b, c) {
return '123'
});
var foo = require('./foo');
console.log(foo.getResult()); // undefined
console.log(reference.result()); // 123
});
});