使用 Got、Nock 和 Chai 在 Node 中测试基本的异步 http 请求
Testing basic async http request in Node with Got, Nock & Chai
我想弄清楚为什么我的单元测试不能正常工作。尽管我使用 Nock 拦截了我的 http 请求,但似乎发出了外部网络请求。
我有一个非常基本的 getUser
服务,getuser-got.js:
const got = require('got');
module.exports = {
getUser(user) {
return got(`https://api.github.com/users/${user}`)
.then(response=>JSON.parse(response.body))
.catch(error => console.log(error.response.body))
}
};
可以调用成功,但我想对其进行单元测试。
这是我在名为 getuser-got.test.js
:
的文件中的代码
const getUser = require('../getuser-got').getUser;
const expect = require('chai').expect;
const nock = require('nock');
const user_response = require('./response');
describe('GetUser-Got', () => {
beforeEach(() => {
nock('https//api.github.com')
.get('/users/octocat')
.reply(200, user_response);
});
it('Get a user by username', () => {
return getUser('octocat')
.then(user_response => {
// expect an object back
expect(typeof user_response).to.equal('object');
// test result of name and location for the response
expect(user_response.name).to.equal('The Octocat')
expect(user_response.location).to.equal('San Francisco')
})
});
});
名为 response
的文件包含来自 Github API 的预期响应的副本,我正在将其加载到 user_response
变量中。我已经替换了 name
和 location
的值以使我的测试失败。
module.exports = {
login: 'octocat',
...
name: 'The FooBar',
company: '@github',
blog: 'https://github.blog',
location: 'Ssjcbsjdhv',
...
}
问题是我可以看到 Nock 没有拦截我的请求。当我 运行 测试时,它继续对外部 API 进行实际调用。因此测试通过了,因为它没有使用我的本地 response
作为 return 值。
我试过添加 nock.disableNetConnect();
但这只会导致测试超时,因为它显然仍在尝试进行外部调用。如果我 运行 我的测试我得到:
➜ nock-tests npm test
> nock-tests@1.0.0 test /Users/corin/Projects/nock-tests
> mocha "test/test-getuser-got.js"
GetUser-Got
✓ Get a user by username (290ms)
1 passing (296ms)
没有让 Nock 拦截我的 http 请求,我做错了什么?
传递给 nock
函数的值无效 URL,它在架构中缺少冒号。
将其更新为 nock('https://api.github.com')
可根据需要使测试在本地失败。
我想弄清楚为什么我的单元测试不能正常工作。尽管我使用 Nock 拦截了我的 http 请求,但似乎发出了外部网络请求。
我有一个非常基本的 getUser
服务,getuser-got.js:
const got = require('got');
module.exports = {
getUser(user) {
return got(`https://api.github.com/users/${user}`)
.then(response=>JSON.parse(response.body))
.catch(error => console.log(error.response.body))
}
};
可以调用成功,但我想对其进行单元测试。
这是我在名为 getuser-got.test.js
:
const getUser = require('../getuser-got').getUser;
const expect = require('chai').expect;
const nock = require('nock');
const user_response = require('./response');
describe('GetUser-Got', () => {
beforeEach(() => {
nock('https//api.github.com')
.get('/users/octocat')
.reply(200, user_response);
});
it('Get a user by username', () => {
return getUser('octocat')
.then(user_response => {
// expect an object back
expect(typeof user_response).to.equal('object');
// test result of name and location for the response
expect(user_response.name).to.equal('The Octocat')
expect(user_response.location).to.equal('San Francisco')
})
});
});
名为 response
的文件包含来自 Github API 的预期响应的副本,我正在将其加载到 user_response
变量中。我已经替换了 name
和 location
的值以使我的测试失败。
module.exports = {
login: 'octocat',
...
name: 'The FooBar',
company: '@github',
blog: 'https://github.blog',
location: 'Ssjcbsjdhv',
...
}
问题是我可以看到 Nock 没有拦截我的请求。当我 运行 测试时,它继续对外部 API 进行实际调用。因此测试通过了,因为它没有使用我的本地 response
作为 return 值。
我试过添加 nock.disableNetConnect();
但这只会导致测试超时,因为它显然仍在尝试进行外部调用。如果我 运行 我的测试我得到:
➜ nock-tests npm test
> nock-tests@1.0.0 test /Users/corin/Projects/nock-tests
> mocha "test/test-getuser-got.js"
GetUser-Got
✓ Get a user by username (290ms)
1 passing (296ms)
没有让 Nock 拦截我的 http 请求,我做错了什么?
传递给 nock
函数的值无效 URL,它在架构中缺少冒号。
将其更新为 nock('https://api.github.com')
可根据需要使测试在本地失败。