如何使用 mocha 和 supertest 集成测试 api 格式 'api/:id' 的端点
How to integration test api endpoints of the format 'api/:id' using mocha and supertest
我正在尝试通过将 userId 附加到端点
来集成测试 API 端点到 return 特定用户数据
我目前能够测试 return 所有用户的端点,但是当我尝试通过将用户 ID 附加到我刚刚结束的路由来编写对 return 特定用户数据的测试时向上测试路由 returning 所有用户。
describe('User profile route', () => {
let token = '';
let userId = '';
let userId1 = '';
useInTest();
it('should return a specific user details', (done) => {
signUp(mockData.signUpData).expect(201)
.end(() => {});
signUp(mockData.signUpData1).expect(201)
.end(() => {});
login(mockData.loginData)
.expect(200)
.end((err, res) => {
token = res.body.accessToken;
userId = res.body.user._id;
});
agent.get(`/api/users/${userId1}`).set('Authorization', 'Bearer ' + token)
.expect(200)
.end((err, res) => {
console.log(res.body);
res.body.should.have.length(1);
done();
})
});
}
我希望测试能够通过,但不幸的是,它不只是一直点击这个 api/users
而不是点击这个 api/users/:id
我认为这不是超测问题。你让测试异步怎么样,因为当你的测试发出请求时,userId 可能是未定义的,因为它是在登录后设置的。尝试像这样更新您的代码(在星号中添加单词):
it('should return a specific user details', **async**(done) => {
signUp(mockData.signUpData).expect(201)
.end(() => {});
signUp(mockData.signUpData1).expect(201)
.end(() => {});
**await** login(mockData.loginData)
.expect(200)
.**then**((err, res) => {
token = res.body.accessToken;
userId = res.body.user._id;
});
agent.get(`/api/users/${userId1}`).set('Authorization', 'Bearer ' + token)
.expect(200)
.end((err, res) => {
console.log(res.body);
res.body.should.have.length(1);
done();
})
});
这就是我设法彻底解决问题的方法
describe('User profile route', () => {
let token = '';
let userId = '';
let userId1 = '';
useInTest();
beforeEach( async () => {
signUp(mockData.signUpData).end(() => {});
signUp(mockData.signUpData1).end(() => {});
await login(mockData.loginData)
.then((res) => {
token = res.body.accessToken;
userId = res.body.user._id;
});
await login(mockData.loginData1)
.then((res) => {
userId1 = res.body.user._id;
});
});
it('should return user profile for the currently logged in user', (done) => {
agent.get('/api/users/' + userId).set('Authorization', 'Bearer ' + token)
.end((err, res) => {
res.body.should.have.property('name', 'Arnold');
done();
});
});
}
我正在尝试通过将 userId 附加到端点
来集成测试 API 端点到 return 特定用户数据我目前能够测试 return 所有用户的端点,但是当我尝试通过将用户 ID 附加到我刚刚结束的路由来编写对 return 特定用户数据的测试时向上测试路由 returning 所有用户。
describe('User profile route', () => {
let token = '';
let userId = '';
let userId1 = '';
useInTest();
it('should return a specific user details', (done) => {
signUp(mockData.signUpData).expect(201)
.end(() => {});
signUp(mockData.signUpData1).expect(201)
.end(() => {});
login(mockData.loginData)
.expect(200)
.end((err, res) => {
token = res.body.accessToken;
userId = res.body.user._id;
});
agent.get(`/api/users/${userId1}`).set('Authorization', 'Bearer ' + token)
.expect(200)
.end((err, res) => {
console.log(res.body);
res.body.should.have.length(1);
done();
})
});
}
我希望测试能够通过,但不幸的是,它不只是一直点击这个 api/users
而不是点击这个 api/users/:id
我认为这不是超测问题。你让测试异步怎么样,因为当你的测试发出请求时,userId 可能是未定义的,因为它是在登录后设置的。尝试像这样更新您的代码(在星号中添加单词):
it('should return a specific user details', **async**(done) => {
signUp(mockData.signUpData).expect(201)
.end(() => {});
signUp(mockData.signUpData1).expect(201)
.end(() => {});
**await** login(mockData.loginData)
.expect(200)
.**then**((err, res) => {
token = res.body.accessToken;
userId = res.body.user._id;
});
agent.get(`/api/users/${userId1}`).set('Authorization', 'Bearer ' + token)
.expect(200)
.end((err, res) => {
console.log(res.body);
res.body.should.have.length(1);
done();
})
});
这就是我设法彻底解决问题的方法
describe('User profile route', () => {
let token = '';
let userId = '';
let userId1 = '';
useInTest();
beforeEach( async () => {
signUp(mockData.signUpData).end(() => {});
signUp(mockData.signUpData1).end(() => {});
await login(mockData.loginData)
.then((res) => {
token = res.body.accessToken;
userId = res.body.user._id;
});
await login(mockData.loginData1)
.then((res) => {
userId1 = res.body.user._id;
});
});
it('should return user profile for the currently logged in user', (done) => {
agent.get('/api/users/' + userId).set('Authorization', 'Bearer ' + token)
.end((err, res) => {
res.body.should.have.property('name', 'Arnold');
done();
});
});
}