Как отправить массив в объекте JSON для модульного тестирования ChaiHttp?

#node.js #api #post #chai #chai-http

#node.js #API #Публикация #чай #chai-http

Вопрос:

У меня есть API в node.js , где я могу отправлять полезные данные для нескольких идентификаторов устройств, чтобы обновить их настройки. Например, пример полезной нагрузки, которую я бы отправил, выглядит следующим образом:

 {"DeviceId":["1","2","3"],"Settings":[{"Key":"OnSwitch","Value":"true"}]}
 

После отправки я бы сказал, что все идентификаторы устройств 1,2,3 обновят свои настройки. Это работает правильно, и я протестировал его локально в Postman. Теперь я хочу написать модульный тест, чтобы проверить поведение. Мой модульный тест выглядит следующим образом:

 context('POST With Multiple IDs', () => {
  describe('1,2,3 IDs POST', () => {
    it.only('It should post a full payload with Value True', (done) =>{
        chai.request('http://localhost:3999')
        .post('/api/v2/settings/')
        .set('Authorization', authToken)
        .set('Content-Type', 'application/json')
        .type('Form')
        .send({"DeviceId": ["1", "2", "3"],
            "Settings": [
              {
                "Key": "OnSwitch",
                "Value": "true"
              }
            ]
          })
        .then(res => {
        console.log(res.body);
        res.should.have.status(200);
        res.body.should.be.a('object');
        res.body.should.have.property('message');
        res.body.should.have.property('message').eql('All of the Ids Settings sent for processing.');
        res.body.should.have.property('payload');
        done();
        });
    });
});
 

В коде, где я создаю сообщение, я проверяю, чтобы идентификаторы устройств отображались в массиве. Если они не находятся в массиве, возвращается сообщение о том, что идентификаторы устройств должны быть в массиве. Вот код для этого:

 if (!Array.isArray(req.body.DeviceId)) {
                logInfo({message: 'DeviceId must be an array.', data: req.body}, 'API');
                return res.status(400).send({
                    message: 'DeviceId must be an array.',
                });
            }
 

Когда я запускаю модульный тест выше, я попадаю в этот оператор if и получаю сообщение о том, что req.body.DeviceId это не массив. Если я регистрирую typeof req.body.DeviceId , я получаю undefined logged. С чего бы это вдруг? Это работает нормально, когда я отправляю сообщение локально от postman. То есть, когда я отправляю сообщение локально, запрос post проходит без ошибок. Но chaiHttp сейчас, используя модульный тест, у меня возникли небольшие проблемы. Может кто-нибудь знать, почему это происходит в модульном тестировании, и сделать так, чтобы этого не происходило, я бы не попал в эту проверку массива. Любой совет был бы очень признателен!

Комментарии:

1. Я бы попробовал записать полный req.body, чтобы посмотреть, как это выглядит, возможно.

Ответ №1:

Строка .type('Form') в модульном тестировании отменяет установку типа содержимого в application / json. Эта строка фактически изменяет тип содержимого на другой тип содержимого, который не распознает массивы. Следовательно, удаление этой строки и выполнение следующего модульного теста вместо этого сработало!

 context('POST With Multiple IDs', () => {
  describe('1,2,3 IDs POST', () => {
    it.only('It should post a full payload with Value True', (done) =>{
        chai.request('http://localhost:3999')
        .post('/api/v2/settings/')
        .set('Authorization', authToken)
        .set('Content-Type', 'application/json')
        .type('Form')
        .send({"DeviceId": ["1", "2", "3"],
            "Settings": [
              {
                "Key": "OnSwitch",
                "Value": "true"
              }
            ]
          })
        .then(res => {
        console.log(res.body);
        res.should.have.status(200);
        res.body.should.be.a('object');
        res.body.should.have.property('message');
        res.body.should.have.property('message').eql('All of the Ids Settings sent for processing.');
        res.body.should.have.property('payload');
        done();
        });
    });
});