javascript - Nock 不会拦截对第 3 方的调用

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

我正在尝试使用 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 调用,并使用 stub 拦截对第三方服务的调用,但这并没有发生。我在 Java 世界中使用 WireMock 实现了类似的事情。是否可以使用 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 works通过当前进程内存中 Node 的 http 和 https 模块的猴子修补函数。这意味着对 Nock 的调用必须与发出请求的进程在同一进程中进行。

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

关于javascript - Nock 不会拦截对第 3 方的调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56302117/

相关文章:

javascript - 使用 Ajax 将参数和文件发送到 NodeJs

javascript - 使用内置过滤器时,Angular 2 ag-grid 的“清除过滤器”按钮会清除文本框而不刷新列

c# - 有什么方法可以自动化 Windows 窗体测试吗?

python - Pytest 未从目录中选择所有测试

groovy - Spock vs FitNesse

javascript - 通过从本地存储调用其副本来重新加载 Windows 应用商店应用程序

javascript - 如何解析 multer 返回的 javascript 对象?

java - TDD:为什么让应用程序代码知道它正在测试而不是运行可能是错误的?

Python - 如何在 View 中模拟实例

amazon-web-services - 如何使用 moto 创建具有特定图像 ID 的 ami?