在流程中编写规范:测试变量是否已设置

Writing specs in flow: test whether variables got set

我有以下规范,其中 somePromise() returns 为真或抛出错误:

describe('context level 1', () => {
  let a;
  let error;

  beforeEach(async () => {
    a = undefined;
    error = undefined;

    try {
      a = await somePromise();
    } catch (e) {
      error = e;
    }
  });

  afterEach(() => {
    a = null;
    error = null;
  });


  describe('context level 2', () => {
    before(() => {
      doSomeSetup();
    });

    it('test case 1', () => {
      a.should.balahalah();
    });
  });

  describe('context level 2', () => {
    before(() => {
      doSomeSetup();
    });

    it('test case 2', () => {
      error.message.should.equal('xxxdasfsda');
    });
  });
});

规格按预期工作,但 flow check(我的项目使用 facebook 流程)显示错误,例如:

Cannot get error.message because property message is missing in null [1].

问:这些specs应该怎么写成flow?

Flow 不知道 beforeEach 之类的事情,也不应该知道。 Flow 表示 error 在您的测试中可能是 null。在您的情况下,如果是这种情况,您的测试运行器应该捕获异常并使测试失败。所以有两种方法可以解决这个问题:

1) 让测试运行器处理异常

您可以修改 .flowconfig 以包含此内容:

[options]
suppress_comment=\(.\|\n\)*\$ExpectError

那么在你的测试中:

// $ExpectError
error.message.should.equal('xxxdasfsda');

这意味着您知道此处存在流程错误,但如果发生,它将由测试运行程序处理。

2) 靠流量

我更喜欢这种方法,尽管它会产生更多代码,因为它更明确并且测试更清晰:

it('test case 2', () => {
  if (!error) {
    assert.fail('Error was not set correctly');
  }
  error.message.should.equal('xxxdasfsda');
});

您可以显式处理所有可能的场景,以避免流程错误。

describe('context level 1', () => {
  describe('context level 2', () => {
    before(() => {
      doSomeSetup();
    });

    it('test case 1', () => {
      try {
        const a = await subject();
        should(result).balahalah();
      } catch (e) {
        should.not.exist(e);
      }
    });
  });

  describe('context level 2', () => {
    before(() => {
      doSomeSetup();
    });

    it('test case 2', () => {
      try {
        const a = await subject();
        should.not.exist(a);
      } catch (e) {
        e.message.should.equal('xxxdasfsda');
      }
    });
  });
});