使用Nock拦截Typescript的async \ await http(axios)请求时出现问题

时间:2019-02-04 16:28:17

标签: typescript axios nock

我正尝试让单元测试针对async \ await函数(使用Typescript)运行,如下所示:

axiosInstance(): AxiosInstance {
    return axios.create({
      baseURL: 'https://some-endpoint.com',
      timeout: 5000,
      withCredentials: false,
      headers: {
        Accept: 'application/json, text/plain, */*',
        'X-AIMS-Auth-Token': this.getToken(),
      },
    });
  }      
async getEndpoint(): Promise<any> {
        const xhr = this.axiosInstance();
        const endpoint = await xhr.get('/endpoints/bla/123');
        return endpoint;
      }

我正在使用nock尝试拦截并模拟对我的请求的响应:

import * as nock from 'nock';

describe('When determining an endpoint for service', () => {
  it('should return the resolved endpoint', async () => {
    const scope = nock('https://some-endpoint.com')
      .get('/endpoints/bla/123')
      .reply(200, { foo: 'bar' });
    const endpoint = await ALClient.getEndpoint();
    console.log(endpoint);
    expect(scope.isDone()).to.be.true;
  });
});

我只是想证明我的nock处理程序在期望中得到了满足,但是失败了,取而代之的是对端点进行了一次真正的调用,而不是返回我的{ foo: 'bar'}响应,我结束了得到真正服务回馈的回应。

我看不到这里哪里出了问题,有人可以建议这里发生什么吗?

谢谢

2 个答案:

答案 0 :(得分:1)

我认为,如果没有PrimeNG修改其组件以在下拉组件上添加滚动方法,或者甚至更好的是,一个用于确定在下拉列表打开时是否应将所选项目自动滚动到的属性,是无法解决任何问题的。 (或者也许应该像非虚拟模式那样一直这样做)

说明

使用ViewChild(在componentA上说)(即使像您一样使用forwardRef)也将无法正常工作,因为它只能从componentA'访问直接子组件。的模板(包含下拉菜单的模板),但是它无法从子组件模板(即PrimeNG下拉组件本身)访问子模板。

使用ContentChild进行相同操作,这是通过design

您的示例中有一个祖父母组件(AppComponent),一个孩子(Dropdown)和一个大孩子(CdkVirtualScrollViewport)。

从SO到祖父母组件访问孙子组件的大多数答案都建议:

  • 在子组件中添加@ViewChild(GrandChildComponent) grandChild
  • 在祖父母组件中添加@ViewChild(ChildComponent) child
  • 从祖父母那里,使用this.child.grandChild访问孙子

但是这在这里不起作用,因为子组件是您无法控制的第三方组件。所以这就是为什么我认为最好的方法是建议对PrimeNG进行改进

答案 1 :(得分:1)

这是由于this issue8.0.1版中已通过 this PR。因此,升级primeng即可解决此问题。

我也打开了another issue,指出了与 合并此PR时,请注意选择的项目并提出fix PR 所有可以解决选择问题的问题都将得到解决。