Nock不会拦截与第三方的通话

时间:2019-05-25 05:48:06

标签: 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调用,并使用存根截取对第三方服务的调用,但这没有发生。使用 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);
    });

1 个答案:

答案 0 :(得分:1)

Nock works通过在当前进程的内存中从Node的http和https模块进行猴子修补功能实现。这意味着对Nock的调用必须与发出请求的过程相同。

对于您而言,无论是为“ internal-url.com”运行的应用程序,都需要调用nock。 nock和supertest的常见约定是在与测试相同的过程中运行内部应用程序的实例。 Supertest examples展示了如何使用Express之类的框架来实现此目的。