为 Joi 验证编写测试
Writing test for Joi validation
我有以下型号:
const mongoose = require("mongoose");
const Joi = require("@hapi/joi");
const activitySchema = new mongoose.Schema({
title: {
type: String,
maxlength: 255,
minlength: 3,
required: true
}
});
const Activity = mongoose.model("Activity", activitySchema);
function validateActivity(activity) {
const schema = Joi.object({
title: Joi.string().min(3).max(255).required()
});
return schema.validate(activity)
}
module.exports.Activity = Activity;
module.exports.validate = validateActivity;
我正在为 validateActivity 函数编写单元测试。我不确定编写这些测试的最佳做法是什么。
到目前为止我想出了:
const {validateActivity} = require("../../models/activity");
describe("activity model", () => {
let mockActivity;
beforeEach(() => {
mockActivity = {
title: "123"
}
});
it("should return an error if no title is provided", () => {
delete mockActivity.title;
const result = validateActivity(mockActivity);
expect(result.error.details[0].type).toMatch(/any.required/);
});
it("should return an error if title is not a string", () => {
mockActivity.title = { test: "test" };
const result = validateActivity(mockActivity);
expect(result.error.details[0].type).toMatch(/string.base/);
});
it("should return an error if title is less than 3 chars", () => {
mockActivity.title = "12";
const result = validateActivity(mockActivity);
expect(result.error.details[0].type).toMatch(/string.min/);
});
it("should return an error if title is more than 255 chars", () => {
mockActivity.title = Array(258).join("a");
const result = validateActivity(mockActivity);
expect(result.error.details[0].type).toMatch(/string.max/);
});
});
因此,一旦我将多个字段添加到我的模型中,测试就会非常重复。是不是每个场景都要写一个测试?
查看此评论后 似乎没有必要检查每个场景,因为我们可以相信验证功能已经在 Joi 中进行了测试。
我想这完全取决于您希望验证的严格程度和重要性。如果您有一个以数据为中心的应用程序,而您的面包和黄油就是数据。如果你不彻底测试你的数据,你可能会陷入糟糕的境地。
现在想象一下,在您的情况下,您有一个模式,但没有测试。例如,如果您删除 max(255)
条件,您的所有测试都将通过(因为您没有任何测试)并且您的客户将能够插入长于 255 的数据,这显然是错误的。
我看不出你做的有什么不对。当您有多个字段时,您可以考虑对内容进行分组。简而言之,如果数据完整性对您来说非常重要,您应该彻底测试您的架构。
我有以下型号:
const mongoose = require("mongoose");
const Joi = require("@hapi/joi");
const activitySchema = new mongoose.Schema({
title: {
type: String,
maxlength: 255,
minlength: 3,
required: true
}
});
const Activity = mongoose.model("Activity", activitySchema);
function validateActivity(activity) {
const schema = Joi.object({
title: Joi.string().min(3).max(255).required()
});
return schema.validate(activity)
}
module.exports.Activity = Activity;
module.exports.validate = validateActivity;
我正在为 validateActivity 函数编写单元测试。我不确定编写这些测试的最佳做法是什么。
到目前为止我想出了:
const {validateActivity} = require("../../models/activity");
describe("activity model", () => {
let mockActivity;
beforeEach(() => {
mockActivity = {
title: "123"
}
});
it("should return an error if no title is provided", () => {
delete mockActivity.title;
const result = validateActivity(mockActivity);
expect(result.error.details[0].type).toMatch(/any.required/);
});
it("should return an error if title is not a string", () => {
mockActivity.title = { test: "test" };
const result = validateActivity(mockActivity);
expect(result.error.details[0].type).toMatch(/string.base/);
});
it("should return an error if title is less than 3 chars", () => {
mockActivity.title = "12";
const result = validateActivity(mockActivity);
expect(result.error.details[0].type).toMatch(/string.min/);
});
it("should return an error if title is more than 255 chars", () => {
mockActivity.title = Array(258).join("a");
const result = validateActivity(mockActivity);
expect(result.error.details[0].type).toMatch(/string.max/);
});
});
因此,一旦我将多个字段添加到我的模型中,测试就会非常重复。是不是每个场景都要写一个测试?
查看此评论后 似乎没有必要检查每个场景,因为我们可以相信验证功能已经在 Joi 中进行了测试。
我想这完全取决于您希望验证的严格程度和重要性。如果您有一个以数据为中心的应用程序,而您的面包和黄油就是数据。如果你不彻底测试你的数据,你可能会陷入糟糕的境地。
现在想象一下,在您的情况下,您有一个模式,但没有测试。例如,如果您删除 max(255)
条件,您的所有测试都将通过(因为您没有任何测试)并且您的客户将能够插入长于 255 的数据,这显然是错误的。
我看不出你做的有什么不对。当您有多个字段时,您可以考虑对内容进行分组。简而言之,如果数据完整性对您来说非常重要,您应该彻底测试您的架构。