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

vltsax25  于 8个月前  发布在  Jest
关注(0)|答案(4)|浏览(119)

我试图添加一个单元测试来验证Yup.isValid函数,但在运行测试用例后显示错误为:Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL。即使我改变了jasmine的最小超时,也显示相同的错误。我验证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);
  });


上面的测试用例不去然后我可以把我的条件。同样的错误来了,我提到。我如何解决这个问题?

cigdeys3

cigdeys31#

对于大型模式,最好使用yup的validateAt API来传递要验证的路径,这样fixture数据可以更简洁。
Jest规范可能看起来像这样:

await expect(schema.validateAt(path, fixture)).rejects.toBeTruthy()

个字符
单元测试是很有趣的,因为它有很多是配置,测试库的工作方式可能是无关紧要的。然而,这似乎有助于测试更复杂的自定义模式验证行为。

3yhwsihp

3yhwsihp2#

validateSchema使用了promise构造反模式,并展示了将其视为反模式的原因之一,new Promise是不必要的构造,容易出现人为错误。
使用async作为Promise执行器是一个错误,它会导致反模式。Promise执行器会忽略从async函数返回的promise。resolve永远不会被调用,而.catch(error => reject(error))是无操作的。validateSchema返回rejected或pending promise。如果从测试返回pending promise,这会导致超时。
它应该是:

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

字符串
很少需要混合await和原始promise。在测试中使用catch中的dummy函数将导致抑制错误,这很少是一种可取的行为。
测试可以是:

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

r1zhe5dt

r1zhe5dt3#

只是另一个例子,我主要是检查真实值

it( 'should handle validating object', async () => {
  const result = await schema.isValid(myObject)
  expect( result ).toEqual( true )
} )

字符串

nbysray5

nbysray54#

我们使用schema.validate()方法和promiseAssert:

describe('Standing order form validations', () => {
    it('passes when required form values are valid', async () => {
        const schema = getValidationSchema();

        const result = schema.validate({
            receiver: { iban: 'AT352011142012679110' },
            nextExecutionDate: getTomorrow(),
            executionInterval: EXECUTION_INTERVAL.MONTHLY,
            amount: { value: 100, precision: 2, currency: 'EUR' },
        });

        await expect(result).resolves.toBeTruthy();
    });

    ...

字符串
这会提供详细的反馈,说明哪些规则显式失败:


的数据
这有助于理解为什么模式会很快失败。

相关问题