【问题标题】:Writing test for Joi validation为 Joi 验证编写测试
【发布时间】:2020-03-13 04:27:42
【问题描述】:

我有以下型号:

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

});

因此,一旦我向我的模型添加了几个字段,测试就会非常重复。是否需要为每个场景编写一个测试?

【问题讨论】:

    标签: node.js mongoose jestjs joi


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-02-20
        • 1970-01-01
        • 1970-01-01
        • 2018-09-24
        • 2018-02-03
        • 1970-01-01
        • 2020-05-08
        相关资源
        最近更新 更多