проверьте чай, как и было обещано, на объекте с несколькими свойствами

привет, у меня есть метод, который возвращает мне данные вместе с URL-адресом, поэтому возвращаемый объект имеет URL-адрес и тело как два свойства.

  return new Promise(function(resolve,reject)
    {
      request(url, function (error, response, body) {
        if(error)
              reject(error);
          else
          {
              if(response.statusCode ==200)
                    resolve( { "url" :url , "body" : body});
                else
                    reject("error while getting response from " + url);
          }
      });

    });

Как я должен проверить это в Chai- как и обещал

это работает для 1 собственности.

it("get data from correct url", function(){
   return expect (httphelper.getWebPageContent(config.WebUrl))
   .to.eventually.have.property('url')
});

если я включаю другое свойство, оно ищет внутри предыдущего свойства.

it("get data from correct url", function(){
   return expect (httphelper.getWebPageContent(config.WebUrl))
   .to.eventually.have.property('url')
   .and.to.have.property('body')
});

AssertionError: ожидается, что 'http://www.jsondiff.com/' будет иметь свойство 'body'

где я ошибаюсь?


person Manish Parab    schedule 05.09.2017    source источник
comment
Работает ли это без промисов (то есть без eventually) в простом Chai?   -  person Bergi    schedule 06.09.2017
comment
Пожалуйста, примите предложенный ответ, если он работает для вас.   -  person robertklep    schedule 19.09.2017


Ответы (2)


Создайте объект с ожидаемыми свойствами:

const expected = {
    url: "expected url",
    body: "expected body"
};

Затем убедитесь, что результат включает эти свойства с помощью:

return expect(httphelper.getWebPageContent(config.WebUrl))
.fulfilled.and.eventually.include(expected);
person Troopers    schedule 06.09.2017

Сначала о вашей проблеме; проверка на body происходит в объекте url, а не в исходном объекте (цепочка похожа на цепочку jQuery), и, как говорится в сообщении об ошибке, строка http://www.jsondiff.com/ не имеет свойства body.

Учитывая это, одним из решений было бы получить возвращенный объект, а затем выполнить две отдельные проверки:

it('get data from correct url', async () => {
  const res = await httphelper.getWebPageContent(config.WebUrl));

  expect(res).to.have.property('url');
  expect(res).to.have.property('body');
});

или если вы хотите придерживаться chai-as-promised:

it('get data from correct url', async () => {
  const res = httphelper.getWebPageContent(config.WebUrl));

  expect(res).to.be.fulfilled
  .then(() => {
    expect(res).to.have.property('url');
    expect(res).to.have.property('body');
  });
});

Другим решением было бы получить ключи объекта, а затем использовать функцию members(), чтобы увидеть, содержит ли список ваши свойства:

it('get data from correct url', async () => {
  const res = await httphelper.getWebPageContent(config.WebUrl));

  expect(Object.keys(res)).to.have.members(['url', 'body']);
});
person Mark Birbeck    schedule 27.02.2018