【问题标题】:How to encapsulate mocha `expect()` code?如何封装 mocha `expect()` 代码?
【发布时间】:2019-03-25 16:40:41
【问题描述】:

我正在尝试测试是否存在我希望在所有测试中都需要的一些 api 响应属性(statusdata 属性)。

这是一个在 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


【解决方案1】:

您可以将expect() 调用的函数外推到另一个返回您将status 传递给的函数的函数:

export function statusCheck(status) {
  return 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)
  }
}

现在在您的原始文件中,您可以调用:

.expect(statusCheck(200))

这里有一个 sn-p 显示它是如何工作的:

// Ignored since status is scoped below
const status = 400

// Returns your (res) => {} function, uses status
function statusCheck(status) {
  return res => {
    console.log(`Desired status number is ${status}`)
    if(res.status === status) console.log(`Response: ${res.status}, It worked!`)
    else console.log(`Response: ${res.status}, It failed!`)
  }
}

// Testing if it works with a mockup
const thisGoesInsideExpect = statusCheck(200)
const res = {status: 200}
thisGoesInsideExpect(res)

【讨论】:

    猜你喜欢
    • 2015-11-19
    • 2013-01-26
    • 2018-11-13
    • 1970-01-01
    • 2023-03-29
    • 2018-08-13
    • 2015-11-04
    • 2013-04-24
    • 2015-10-19
    相关资源
    最近更新 更多