結論
rewire という package を使うと module.exports
していない関数を Jest でテストできます。
https://github.com/jhnns/rewire
背景
CF2 の関数を Git 管理しています。
その関数を Jest でテストしたいと思いましたが、CF2 では module.exports
が使えません。
よって module.exports
をせずに、Jest でテストを書く方法が知りたいと思いました。
前提
この記事では、例として下記の関数を想定します。
index.js
function handler(event) {
var response = event.response;
var headers = response.headers;
if (!headers["access-control-allow-origin"]) {
headers["access-control-allow-origin"] = { value: "*" };
}
return response;
}
方法
まず rewire を install します。
$ npm install -D rewire
続いて rewire を使ってテストを書きます。
index.spec.js
const rewire = require("rewire");
const handler = rewire("../path/to/index.js").__get__("handler");
describe("handler", () => {
describe("access-control-allow-origin に値が設定されている場合", () => {
test("何もしない", () => {
const event = {
response: {
headers: {
"access-control-allow-origin": "https://example.com",
},
},
};
expect(
handler(event).headers["access-control-allow-origin"].value.toMatch(
"https://example.com"
)
);
});
});
describe("access-control-allow-origin に値が設定されていない場合", () => {
test("'*'を設定する", () => {
const event = {
response: {
headers: {
"access-control-allow-origin": "",
},
},
};
expect(
handler(event).headers["access-control-allow-origin"].value.toMatch("*")
);
});
});
});
下記の内容さえ書いてしまえば、通常の方法と同様にテストを書くことができます。
const rewire = require("rewire");
const handler = rewire("../path/to/index.js").__get__("handler");
通常の方法との差分
- const handler = require("../path/to/index.js")
+ const rewire = require("rewire");
+ const handler = rewire("../path/to/index.js").__get__("handler");
参考