无法使用nock移除拦截器

时间:2019-07-17 10:04:11

标签: node.js nock

我正在使用nock,并且正在尝试删除某些主机名的拦截器。

我尝试使用:

nock.removeInterceptor({
      hostname: 'somehostname.com',
      proto: 'https',
      path: '/',
    }),

当我打印结果时,它实际上给了我 true

我也尝试过:

const mock = nock(somehostname.com)
    .persist()
    .post('/endpoint')
    .reply(200);

nock.removeInterceptor(mock)

但这以某种方式给了我 false

我检查此方法是否有效的方法是打印activeMocks: nock.activeMocks() 而且仍然有我要删除的拦截器。

有人知道会发生什么吗?

3 个答案:

答案 0 :(得分:4)

我遇到了同样的问题,我这样解决了:

CMDER_ROOT=%CMDER_ROOT%

const mock = nock(somehostname.com) .persist() .post('/endpoint') .reply(200); nock.removeInterceptor(mock.interceptors[0]) 是为此作用域注册的所有Interceptor对象的数组,因此我获得了最新创建的作用域并将其从nock删除。

答案 1 :(得分:0)

似乎nock在下面使用了单例,并且调用nock("my/base-route/i/already/mocked")返回了作用域,然后可以通过使用scope.get("my/endpoint/I/already/mocked")来再次查询拦截器,nock.removeInterceptor(interceptor)返回了拦截器。然后可以使用true删除该拦截器,该拦截器应返回function mockRoute() { nock("my/base-route/i/already/mocked") .get("my/endpoint/I/already/mocked") .reply("Something") } function removeExistingMock(): boolean { const scope = nock("my/base-route/i/already/mocked") const interceptor = scope.get("my/endpoint/I/already/mocked") return nock.removeInterceptor(interceptor) }

总共:

library(data.table)
df <- data.table(abc = rep(1:5,2), xyz = c(rep(1, 5), rep(2, 5)))#
library(Rcpp)
cppFunction("
            NumericVector foo(const NumericVector xyz) {
            double n = xyz.length();
            NumericVector res(n);
            res[0] = 0.25 * xyz[0];
            for (double i = 1; i < n; ++i) {
            res[i] = 0.25 * xyz[i] + 0.75 * res[i-1];
            }
            return res;
            }
            ")

df[, q1 := foo(xyz), by = rleid(cumprod(c(0, diff(abc))))]
    abc xyz        q1
# 1:   1   1 0.2500000
# 2:   2   1 0.4375000
# 3:   3   1 0.5781250
# 4:   4   1 0.6835938
# 5:   5   1 0.7626953
# 6:   1   2 0.5000000
# 7:   2   2 0.8750000
# 8:   3   2 1.1562500
# 9:   4   2 1.3671875
#10:   5   2 1.5253906

答案 2 :(得分:0)

这对我有用:

nock.removeInterceptor({
  proto: 'https',
  hostname: 'www.somehostname.com',
  path: `/somepath`,
})

确实需要一些反复试验并查看代码才能获得正确的选项。它看起来与您的代码非常相似,因此我能看到的唯一可能的区别是包含子域和完整路径。

请注意,删除拦截器并不会删除模拟本身。也就是说,请求将失败而不是被允许通过实际的 url。

我发现布尔返回值没有帮助。即使没有删除拦截器,它也可以返回 true。我创建了一个 issue for that