为 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/);
  });

});

因此,一旦我将多个字段添加到我的模型中,测试就会非常重复。是不是每个场景都要写一个测试?

查看此评论后 似乎没有必要检查每个场景,因为我们可以相信验证功能已经在 J​​oi 中进行了测试。

我想这完全取决于您希望验证的严格程度和重要性。如果您有一个以数据为中心的应用程序,而您的面包和黄油就是数据。如果你不彻底测试你的数据,你可能会陷入糟糕的境地。

现在想象一下,在您的情况下,您有一个模式,但没有测试。例如,如果您删除 max(255) 条件,您的所有测试都将通过(因为您没有任何测试)并且您的客户将能够插入长于 255 的数据,这显然是错误的。

我看不出你做的有什么不对。当您有多个字段时,您可以考虑对内容进行分组。简而言之,如果数据完整性对您来说非常重要,您应该彻底测试您的架构。