【发布时间】:2019-03-25 16:40:41
【问题描述】:
我正在尝试测试是否存在我希望在所有测试中都需要的一些 api 响应属性(status 和 data 属性)。
这是一个在 supertest expect() 方法中断言所需属性的通用测试:
it('should create a widget', done => {
let status = 200;
request(test_url)
.post('/api/widgets')
.set('Authorization', `Bearer ${token}`)
.send({
sku: my_widget_data.sku,
name: my_widget_data.name,
description: ''
})
.expect(res => {
assert(
Object.keys(res.body).includes('status'),
'`status` is a required field'
);
assert(
Object.keys(res.body).includes('data'),
'`data` is a required field'
);
assert.strictEqual(res.body.status, status);
assert.strictEqual(res.status, status);
})
.end((err, res) => {
if (err) return done(err);
done();
});
});
这种expect() 行为将在我的几乎所有测试中都很常见。
我如何提取 expect() 行为来干燥我的测试,同时仍然传递任意状态数字?
【问题讨论】:
-
您正在传递
expect一个函数。您没有理由不能将该函数保存在其他地方并将对该函数的引用传递到所有测试中。 -
@MarkMeyer 没错,但
expect()需要一个签名为(res) => any的函数。我不确定如何将我的status传递给该函数。 -
嗯……我明白你的意思了。
-
我觉得有一种方法可以使用柯里化或偏函数来做到这一点,但我不太明白......
-
这里是方法:
const correctStatus = function ( status, res ) { /* ... */ };和const status200 = correctStatus.bind( null, 200 );然后你可以做.expect( status200 )。
标签: javascript currying supertest web-api-testing