代码之家  ›  专栏  ›  技术社区  ›  Gorakh Nath

如何使用Jest为是的。是有效的功能?

  •  4
  • Gorakh Nath  · 技术社区  · 6 年前

    我正在尝试添加一个单元测试来验证 Yup.isValid Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL

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

    上面的测试用例不会转到我可以设置条件的地方。正如我提到的,同样的错误也来了。我如何解决这个问题?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Estus Flask    6 年前

    validateSchema 使用promise构造反模式,并说明它被视为反模式的原因之一, new Promise 是不必要的结构,容易出现人为错误。

    async 作为 Promise executor是导致反模式的错误。 执行者忽略从 异步 功能。 resolve 从不打电话,而 .catch(error => reject(error)) 是不行的。 验证架构

    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
    });
    
        2
  •  0
  •   user3697963    5 年前

    对于大型模式,最好使用yup的validateAPI来传递要验证的路径,这样fixture数据可以更简洁。

    笑话的规格可能看起来像:

    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()
    
      }
    

    单元测试是很有趣的,因为很多都是配置,测试库的工作方式可能是无关的。然而,这对于测试更复杂的定制模式验证行为似乎有帮助。

        3
  •  0
  •   Jose    4 年前

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