【问题标题】:Nock does not intercept call to 3rd partyNock 不拦截对第 3 方的呼叫
【发布时间】:2019-05-25 05:48:06
【问题描述】:

我正在尝试使用 SuperTest 自动化一些 REST 服务。该服务是一个 POST 调用,它在内部调用另一个第三方服务 GET 方法。我正在尝试模拟第三方服务以提高测试效率并减少测试执行时间。 我正在使用 nock 来模拟第三方服务调用。

我的初始服务调用看起来像 -

curl -X POST \
  http://internal-url.com/path \
  -H 'Content-Type: application/json' \
  -H 'cache-control: no-cache' \
  -d '{
    "key1": "value1",
    "key2": "value2"
}'

此服务调用第三方服务,看起来像 -

curl -X GET \
  'http://3rdparty-url.com/value1' \
  -H 'Content-Type: application/json' \
  -H 'cache-control: no-cache' \
  -H 'key2: value2'

我在 beforeTest 中使用 nock 模拟了服务,例如 -

nock('http://3rdparty-url.com')
    .get('/value1')
    .reply(200, 'domain matched');

当我使用 SuperTest 直接调用此第三方服务时,它会返回模拟响应。但是,我的目标是进行 POST 调用,并使用存根拦截对第三方服务的调用,但这并没有发生。我使用 WireMock 在 Java 世界中实现了类似的目标。使用 nock 可以做到这一点吗?

我的测试看起来像 -

var payload = {"key1": "value1", "key2": "value2"};
describe('Test third party Service', function () {
    it('should return success on POST /path service', function (done) {
        supertest('http://internal-url.com')
            .post('/path')
            .send(payload)
            .expect(200)
            .expect('Content-type', /application\/json/)
            .expect(function (response) {
                console.log(response.body);
                //test fails as third party server is not available and mock doesn't intercept
            })
            .end(done);
    });

【问题讨论】:

  • nock 是可能的,你的例子是正确的。在您的测试中必须有其他设置不正确。如果您使用 supertest 包含您的代码来调用您的本地应用程序,这可能会有所帮助。
  • @MattR.Wilson - 更新了测试
  • 您采取了哪些步骤来验证从您的内部应用程序发送的请求与您在上面发布的 curl GET 请求相同?另外,内部应用是否与测试运行在同一个 Node 进程中?
  • @MattR.Wilson - 我已经验证了应用程序日志,它显示了我正在使用的确切 CURL。第二点,应用程序和测试在不同的 Node 进程上运行。会不会是这个问题?

标签: javascript mocking automated-tests web-api-testing nock


【解决方案1】:

Nock works 来自当前进程内存中 Node 的 http 和 https 模块的猴子补丁功能。这意味着对 Nock 的调用必须与发出请求的进程在同一进程中进行。

在您的情况下,任何运行“internal-url.com”应用程序的程序都需要调用 nock。 nock 和 supertest 的一个常见约定是在与测试相同的进程中运行内部应用程序的实例。 Supertest examples 展示了如何使用 Express 之类的框架来做到这一点。

【讨论】:

  • 我认为最好提供一些上下文来说明您的意思,而不仅仅是 URL 引用。如果该 URL 损坏或不复存在会怎样???‍♂️
  • 整个第一段是回答有关 Nock 的具体问题的上下文。第二段旨在帮助引导 OP 为其用例(恰好是 Supertest)朝着正确的方向发展。由于这个问题与 Supertest 无关,因此我故意没有从其自述文件中复制/粘贴代码,因为它离题了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多