我正在尝试生成一些断言来测试我的Restful CRUD API,但我不是如何测试新生成的文档。我还使用Express + Firebase,因此ID就是电子邮件本身,因此可以轻松测试用户。但是,对于任何其他文档,标识是随机创建的。
例如,我的用户测试如下:
describe('POST - /api/admin/users', () => {
it('Should create a user', done => {
const user: IUser = {
name: 'User TDD Test',
email: '[email protected]',
password: '123456',
createdAt: 1585848131576
};
chai.request(server)
.post('/api/admin/users')
.send(user)
.end((err, response) => {
response.should.have.status(201);
response.body.should.be.an.instanceOf(Object);
response.body.should.have.property('message').eq('User created');
response.body.should.have.property('data')
.and.be.an.instanceOf(Object)
.and.have.property('name').eq('UserTDD Test');
response.body.should.have.property('ok').eq(true);
done();
});
});
});
describe('PUT - /api/admin/users/:email', () => {
it('Should update a user', done => {
const email = '[email protected]'
const user: object = {
password: '1234567',
updatedAt: 1585848131576
};
chai.request(server)
.put('/api/admin/users/' + email)
.send(user)
.end((err, response) => {
response.should.have.status(201);
response.body.should.be.an.instanceOf(Object);
response.body.should.have.property('message').eq('User updated');
response.body.should.have.property('data').eq(null);
response.body.should.have.property('ok').eq(true);
done();
});
});
});
在这里,更新相同的文档很容易,因为它们共享相同的电子邮件。但是,例如,如果我想用生成的ID更新任何其他集合,就无法以相同的方式测试创建和更新,对吧?
例如,如果我为集合“票”使用相同的代码:
describe('POST - /api/admin/tickets', () => {
it('Should create a ticket', done => {
const ticket: ITicket = {
owner: '[email protected]',
status: 'Open',
createdAt: 1585848131576
};
chai.request(server)
.post('/api/admin/tickets')
.send(ticket)
.end((err, response) => {
response.should.have.status(201);
response.body.should.be.an.instanceOf(Object);
response.body.should.have.property('message').eq('Created ticket');
response.body.should.have.property('data')
.and.be.an.instanceOf(Object)
.and.have.property('owner').eq('[email protected]');
response.body.should.have.property('ok').eq(true);
done();
});
});
});
然后,先前生成的票证的ID属性具有未知的值,因此,我应该针对具有已知ID的另一票证测试“ PUT方法”吗?
我知道这不是解决方案,而是解决方法。我认为这甚至不是一个好习惯,但是可以。
首先,我在测试时将NODE_ENV=test
添加到了环境变量中:
"scripts": {
"dev": "ts-node-dev src/app.ts",
"start": "node dist/app.js",
"test": "env NODE_ENV=test TS_NODE_PROJECT=\"tsconfig.testing.json\" mocha --require ts-node/register 'src/test/**/*.ts'",
"build": "tsc -p"
},
我只是将ID添加到req.body
,并且仅在process.env.NODE_ENV === 'test'
时读取它。所以我将其添加到路由中:
const data: object = req.body;
...
const id: string = !empty(data.id) && process.env.NODE_ENV === 'test' ? data.id : null;
delete data.id;
const ref: any = !empty(id)
? db.collection('tickets').doc(id)
: db.collection('tickets');
try {
empty(id) ? await ref.add(data) : await ref.set(data);
result.message = 'Ticket created';
result.data = data;
result.ok = true;
return res.status(201).json(result);
} catch(error) {
result.message = 'Couldn\'t create ticket';
result.error = error;
console.log(error);
return res.status(500).json(result);
}