在流程中编写规范:测试变量是否已设置
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');
}
});
});
});
我有以下规范,其中 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');
}
});
});
});