【发布时间】: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