如何使用Jest for Yup.isValid函数编写测试用例?

时间:2019-01-14 12:22:25

标签: reactjs jestjs yup

我试图添加一个单元测试来验证Yup.isValid功能,但是在运行测试用例后,错误显示为:Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL。即使我更改了茉莉花的最小超时,也会显示相同的错误。我用来验证Yup模式的功能是:

export const validateSchema= (
  validationSchema,
  data
) => {
  return new Promise(async (resolve, reject) => {
    await validationSchema
      isValid(data)
      .then(isFormValid => {
        //passing response to method
      })
      .catch(error => reject(error));
  });
};

我的测试用例是:

test("validate Schema",async () => {
    let catchFn = jest.fn();
    let data= someSampleData;
    //data is valid as per the schema
   await validationSchema(
        validationSchema,
        data
      )
      .then(res => {
       //My expected condition
      })
      .catch(catchFn);
  });

上面的测试用例并不能满足我的条件。正如我所提到的,同样的错误即将到来。我该如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

validateSchema使用了Promise构造反模式,并显示了它被认为是反图案的原因之一,new Promise是不需要的构造,容易产生人为错误。

async用作Promise执行者是导致反模式的错误。 Promise执行者忽略从async函数返回的承诺。 resolve不会被调用,而.catch(error => reject(error))是不可操作的。 validateSchema返回被拒绝或待处理的承诺。如果测试返回待处理的承诺,则会导致超时。

应该是:

export const validateSchema= async (
  validationSchema,
  data
) => {
    await validationSchema;
    const isFormValid = isValid(data);
    await updateFormValidFlag(isFormValid, theFormName); // does it return a promise?
  });
};

几乎不需要混合await和原始承诺。在测试中catch中使用伪函数会导致抑制错误,而这很少是理想的行为。

测试可以是:

test("validate Schema",async () => {
   let data= someSampleData;
   await validateSchema(...);
   //My expected condition
});

答案 1 :(得分:0)

对于大型模式,最好使用yup的validateAt api传递验证路径,这样夹具数据可以更加简洁。

Jest规格可能类似于:

await expect(schema.validateAt(path, fixture)).rejects.toBeTruthy()
  it("requires person's name", async () => {
    await expect(schema.validateAt('person.name', {})).rejects.toBeFalsy()
    await expect(schema.validateAt('person.name', {person: {name: "something"}})).resolves.toBeTruthy()

  }

单元测试是很有趣的,因为很多是配置,测试库以它们说的方式工作可能是多余的。但是,这似乎有助于测试更复杂的自定义架构验证行为。

答案 2 :(得分:0)

再举一个例子,我主要是检查真实值

chr*6