0

您好,我有一个方法可以将数据与 URL 一起返回,因此返回对象具有 url 和 body 作为两个属性。

  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”

我哪里错了?

4

2 回答 2

3

创建一个具有预期属性的对象:

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

然后确保结果包含以下属性:

return expect(httphelper.getWebPageContent(config.WebUrl))
.fulfilled.and.eventually.include(expected);
于 2017-09-06T15:07:03.080 回答
1

首先是你的问题;检查body发生在 object 上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']);
});
于 2018-02-27T13:48:22.810 回答