MochaJS和Chai测试动态ID

问题描述 投票:2回答:1

我正在尝试生成一些断言来测试我的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方法”吗?

javascript node.js google-cloud-firestore mocha chai
1个回答
0
投票

我知道这不是解决方案,而是解决方法。我认为这甚至不是一个好习惯,但是可以。

首先,我在测试时将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);
    }
© www.soinside.com 2019 - 2024. All rights reserved.