The*_*asn 1 javascript unit-testing jestjs
我有使用puppetteer的page对象评估并返回一些数据的函数。
我想编写一个单元测试,jest以检查是否page.evaluate()采用了指定参数
这是功能
async function cinemasfromState(page, state) {
const CINEMA_SELECTOR = `div[data-state=$[STATE]] div.top-select-option a.eccheckbox`;
let res = await page.evaluate(
(elementPath, state) => {
let results = Array.from(document.querySelectorAll(elementPath)).map(
function(cin, index) {
return {
//Stuff
};
return result;
},
{ state }
);
},
CINEMA_SELECTOR.replace("$[STATE]", state),
state
);
return res;
}
Run Code Online (Sandbox Code Playgroud)
以下是我的测试结果
describe("cinemasfromState", () => {
let page_mock = {
click: jest.fn(() => Promise.resolve()),
evaluate: jest.fn((selector, state) => Promise.resolve())
};
test("page.evaluate called correctly ", async () => {
await cinemasfromState(page_mock, "KAN");
expect(page_mock.evaluate).toBeCalledTimes(1);
expect(
page_mock.evaluate)toBeCalledWith(
"div[data-state=KAN] div.top-select-option a.eccheckbox",
"KAN"
);
});
});
Run Code Online (Sandbox Code Playgroud)
我得到以下错误作为我的测试输出
? cinemasfromState › page.evaluate called correctly
expect(jest.fn()).toBeCalledWith(expected)
Expected mock function to have been called with:
"div[data-state=KAN] div.top-select-option a.eccheckbox"
as argument 1, but it was called with
[Function anonymous].
Difference:
Comparing two different types of values. Expected string but received function.
"KAN"
as argument 2, but it was called with
"div[data-state=KAN] div.top-select-option a.eccheckbox".
undefined
as argument 3, but it was called with
"KAN".
Difference:
Comparing two different types of values. Expected undefined but received string.
52 | expect(page_mock1.evaluate).toBeCalledTimes(1);
53 | expect(page_mock1.evaluate).toBeCalledWith(
> 54 | "div[data-state=KAN] div.top-select-option a.eccheckbox",
| ^
55 | "KAN"
56 | );
57 | });
Run Code Online (Sandbox Code Playgroud)
对编写测试以验证参数有帮助吗?
如果阅读错误日志,您会注意到它正在尝试匹配三个参数,但是您只针对两个参数进行了断言。.toBeCalledWith在开玩笑的情况下,将对传递给函数的参数及其顺序进行精确匹配。
例如,如果您调用func(arg1, arg2),expect(func).toBeCalledWith(arg2)则会失败,因为您未同时声明on arg1。这就是您的情况,因为to的第一个参数page.evaluate()实际上是一个匿名函数。
因此,您的测试将需要如下所示:
expect(page_mock.evaluate).toBeCalledWith(
expect.any(Function),
"div[data-state=KAN] div.top-select-option a.eccheckbox",
"KAN"
);
Run Code Online (Sandbox Code Playgroud)