Как инкапсулировать код mocha `ожидаем ()`? - PullRequest
5 голосов
/ 25 марта 2019

Я пытаюсь проверить наличие некоторых свойств ответа 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() будет распространено почти во всех моих тестах.

Как я могу извлечь ожидаемое () поведение, чтобы высушить мои тесты, все еще передавая произвольные номера статуса?

1 Ответ

6 голосов
/ 01 апреля 2019

Вы можете экстраполировать функцию, которую 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))

Вот фрагмент, показывающий, как это работает:

// 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)
...