为Joi验证编写测试

时间:2020-03-11 04:24:28

标签: node.js mongoose jestjs joi

我有以下模型:

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

});

因此,一旦我在模型中添加了几个字段,测试将非常重复。是否有必要针对每种情况编写测试?

2 个答案:

答案 0 :(得分:1)

我想这全都取决于您希望验证的严格性和重要性。如果您有一个以数据为中心的应用程序,而您的面包和黄油就是数据。如果您不彻底测试数据,则可能会遇到麻烦。

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

我认为您所做的没有任何问题。当您有多个字段时,可以考虑将内容分组。简而言之,如果数据完整性对您来说非常重要,则应该彻底测试架构。

答案 1 :(得分:0)

在查看了此评论https://stackoverflow.com/a/33588497/5733078之后,似乎没有必要检查所有情况,因为我们可以相信validate函数已经在Joi中进行了测试。