我有以下模型:
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/);
});
});
因此,一旦我在模型中添加了几个字段,测试将非常重复。是否有必要针对每种情况编写测试?
答案 0 :(得分:1)
我想这全都取决于您希望验证的严格性和重要性。如果您有一个以数据为中心的应用程序,而您的面包和黄油就是数据。如果您不彻底测试数据,则可能会遇到麻烦。
现在想象一下,在您的情况下,您有一个架构和您没有测试。例如,如果您删除max(255)
条件,则所有测试将通过(因为您没有任何测试),并且客户将能够插入长度超过255的数据,这显然是错误的。
我认为您所做的没有任何问题。当您有多个字段时,可以考虑将内容分组。简而言之,如果数据完整性对您来说非常重要,则应该彻底测试架构。
答案 1 :(得分:0)
在查看了此评论https://stackoverflow.com/a/33588497/5733078之后,似乎没有必要检查所有情况,因为我们可以相信validate函数已经在Joi中进行了测试。