javascript - 笑话:测试类型或空
问题描述
我有一个测试,我想测试我收到的对象值类型是否与模式匹配。问题是对于某些键,我可能会收到一些东西或 null
到目前为止我试过这个
const attendeeSchema = {
birthDate: expect.extend(toBeTypeOrNull("Date")),
contact: expect.extend(toBeTypeOrNull(String)),
createdAt: expect.any(Date),
firstName: expect.any(String),
id: expect.any(Number),
idDevice: expect.extend(toBeTypeOrNull(Number)),
information: expect.extend(toBeTypeOrNull(String)),
lastName: expect.any(String),
macAddress: expect.extend(toBeTypeOrNull(String)),
updatedAt: expect.any(Date),
// state: toBeTypeOrNull()
};
const toBeTypeOrNull = (received, argument) => {
const pass = expect(received).toEqual(expect.any(argument));
if (pass || received === null) {
return {
message: () => `Ok`,
pass: true
};
} else {
return {
message: () => `expected ${received} to be ${argument} type or null`,
pass: false
};
}
};
在我的测试中
expect(res.result.data).toBe(attendeeSchema);
我也尝试过平等和其他东西....
我的测试没有通过
TypeError: any() expects to be passed a constructor function. Please pass one or use anything() to match any object.
我不知道在这里做什么..如果有人有想法谢谢
解决方案
之前给出的所有响应expect()
在它们的实现中都没有正确使用,所以它们并没有真正起作用。
你想要的是一个玩笑匹配器,它的工作方式类似any()
但接受空值并且在其实现中不使用expect()
函数。any()
您可以通过基本上复制原始实现(来自Jasmine )将其实现为扩展,但在开头添加了一个空测试:
expect.extend({
nullOrAny(received, expected) {
if (received === null) {
return {
pass: true,
message: () => `expected null or instance of ${this.utils.printExpected(expected) }, but received ${ this.utils.printReceived(received) }`
};
}
if (expected == String) {
return {
pass: typeof received == 'string' || received instanceof String,
message: () => `expected null or instance of ${this.utils.printExpected(expected) }, but received ${ this.utils.printReceived(received) }`
};
}
if (expected == Number) {
return {
pass: typeof received == 'number' || received instanceof Number,
message: () => `expected null or instance of ${this.utils.printExpected(expected)}, but received ${this.utils.printReceived(received)}`
};
}
if (expected == Function) {
return {
pass: typeof received == 'function' || received instanceof Function,
message: () => `expected null or instance of ${this.utils.printExpected(expected)}, but received ${this.utils.printReceived(received)}`
};
}
if (expected == Object) {
return {
pass: received !== null && typeof received == 'object',
message: () => `expected null or instance of ${this.utils.printExpected(expected)}, but received ${this.utils.printReceived(received)}`
};
}
if (expected == Boolean) {
return {
pass: typeof received == 'boolean',
message: () => `expected null or instance of ${this.utils.printExpected(expected)}, but received ${this.utils.printReceived(received)}`
};
}
/* jshint -W122 */
/* global Symbol */
if (typeof Symbol != 'undefined' && this.expectedObject == Symbol) {
return {
pass: typeof received == 'symbol',
message: () => `expected null or instance of ${this.utils.printExpected(expected)}, but received ${this.utils.printReceived(received)}`
};
}
/* jshint +W122 */
return {
pass: received instanceof expected,
message: () => `expected null or instance of ${this.utils.printExpected(expected)}, but received ${this.utils.printReceived(received)}`
};
}
});
将上述内容放入文件中,然后使用 jest配置变量.js
指向该文件。setupFilesAfterEnv
现在您可以像这样运行测试:
const schema = {
person: expect.nullOrAny(Person),
age: expect.nullOrAny(Number)
};
expect(object).toEqual(schema);
推荐阅读
- amazon-web-services - AWS Elasticsearch Sizing
- javascript - 如何渲染带有隐藏预设痕迹的情节图,即基于列表的“legendonly”
- erlang - 如何计算erlang中列表内容的长度?
- string - 如何在 Dart 中获取字符串的字节数?
- python - Python中的快速整数矩阵零空间?
- c# - AdMob 横幅广告未显示且未显示说明
- android - Ionic 4 离子菜单不适用于 Android 4.4.2
- vba - 使用 SQL UPDATE 访问 VBA
- r - 为什么 rbind 与具有超过 254 列的 data.table 重新排序列名
- python - 二维列表评估如果比