如何让 Jest 自定义匹配器在打字稿中工作?
How to get a Jest custom matcher working in typescript?
我经常进行单元测试,我需要比较两个力矩对象。我用 moment 的内置函数 moment.isSame(moment) 来比较它们。但是,这意味着我的断言将如下所示:
expect(moment1.isSame(moment2)).toBeTrue();
我不太喜欢这样,尤其是因为失败消息的信息量较少。因此,我想编写一个自定义的笑话匹配器 "toBeSameMoment"。以下代码似乎至少可以编译:
import moment from "moment";
declare global {
namespace jest {
interface MomentMatchers extends Matchers<moment.Moment> {
toBeSameMoment: (expected: moment.Moment) => CustomMatcherResult;
}
}
}
expect.extend({
toBeSameMoment(received: moment.Moment, expected: moment.Moment): jest.CustomMatcherResult {
const pass: boolean = received.isSame(expected);
const message: () => string = () => pass ? "" : `Received moment (${received.toISOString()}) is not the same as expected (${expected.toISOString()})`;
return {
message,
pass,
};
},
});
但是,我无法真正让它在我的单元测试中工作...
当我尝试以下测试代码时:
import moment from "moment";
import "../jest-matchers/moment";
describe("Moment matcher", () => {
test("should fail", () => {
const moment1 = moment.utc();
const moment2 = moment();
expect(moment1).toBeSameMoment(moment2);
});
});
...然后出现以下错误:
error TS2339: Property 'toBeSameMoment' does not exist on type 'JestMatchersShape<Matchers<void, Moment>, Matchers<Promise<void>, Moment>>'.
不过我不太明白这个错误。例如,this指的是什么void类型?我试过用谷歌搜索它,但并没有真正找到一个好的指南。我确实注意到了这个问题:How to let know typescript compiler about jest custom matchers?,这似乎基本上是重复的,但显然还不够清楚。
我的 tsconfig 中包含了笑话类型
您链接到的其他问题和答案是正确的,您还可以在 this github comment on react-testing-library 中找到一个非常简洁的示例来说明如何扩展 jest。
要为您的代码实施他们的解决方案,只需更改:
declare global {
namespace jest {
interface MomentMatchers extends Matchers<moment.Moment> {
toBeSameMoment: (expected: moment.Moment) => CustomMatcherResult;
}
}
}
收件人:
declare global {
namespace jest {
interface Matchers<R> {
toBeSameMoment(expected: moment.Moment): CustomMatcherResult;
}
}
}
我经常进行单元测试,我需要比较两个力矩对象。我用 moment 的内置函数 moment.isSame(moment) 来比较它们。但是,这意味着我的断言将如下所示:
expect(moment1.isSame(moment2)).toBeTrue();
我不太喜欢这样,尤其是因为失败消息的信息量较少。因此,我想编写一个自定义的笑话匹配器 "toBeSameMoment"。以下代码似乎至少可以编译:
import moment from "moment";
declare global {
namespace jest {
interface MomentMatchers extends Matchers<moment.Moment> {
toBeSameMoment: (expected: moment.Moment) => CustomMatcherResult;
}
}
}
expect.extend({
toBeSameMoment(received: moment.Moment, expected: moment.Moment): jest.CustomMatcherResult {
const pass: boolean = received.isSame(expected);
const message: () => string = () => pass ? "" : `Received moment (${received.toISOString()}) is not the same as expected (${expected.toISOString()})`;
return {
message,
pass,
};
},
});
但是,我无法真正让它在我的单元测试中工作... 当我尝试以下测试代码时:
import moment from "moment";
import "../jest-matchers/moment";
describe("Moment matcher", () => {
test("should fail", () => {
const moment1 = moment.utc();
const moment2 = moment();
expect(moment1).toBeSameMoment(moment2);
});
});
...然后出现以下错误:
error TS2339: Property 'toBeSameMoment' does not exist on type 'JestMatchersShape<Matchers<void, Moment>, Matchers<Promise<void>, Moment>>'.
不过我不太明白这个错误。例如,this指的是什么void类型?我试过用谷歌搜索它,但并没有真正找到一个好的指南。我确实注意到了这个问题:How to let know typescript compiler about jest custom matchers?,这似乎基本上是重复的,但显然还不够清楚。
我的 tsconfig 中包含了笑话类型
您链接到的其他问题和答案是正确的,您还可以在 this github comment on react-testing-library 中找到一个非常简洁的示例来说明如何扩展 jest。
要为您的代码实施他们的解决方案,只需更改:
declare global {
namespace jest {
interface MomentMatchers extends Matchers<moment.Moment> {
toBeSameMoment: (expected: moment.Moment) => CustomMatcherResult;
}
}
}
收件人:
declare global {
namespace jest {
interface Matchers<R> {
toBeSameMoment(expected: moment.Moment): CustomMatcherResult;
}
}
}