Mocha JS и Chai Test Dynami c ID - PullRequest
       7

Mocha JS и Chai Test Dynami c ID

2 голосов
/ 02 апреля 2020

Я пытаюсь сгенерировать некоторые утверждения для проверки моего Restful CRUD API, но я не знаю, как тестировать новые сгенерированные документы. Я также использую Express + Firebase, так что я смог легко тестировать пользователей, поскольку идентификатор - это само письмо. Но в случае любых других документов идентификаторы создаются случайным образом.

Например, мой пользовательский тест выглядит следующим образом:

    describe('POST - /api/admin/users', () => {
        it('Should create a user', done => {
            const user: IUser = {
                name: 'User TDD Test',
                email: 'tdd@test.com',
                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 = 'tdd@test.com'
            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();
                });
        });
    });

Здесь легко обновить тот же документ, так как они поделиться тем же адресом электронной почты. Но, например, если я хочу обновить любую другую коллекцию сгенерированным идентификатором, я не смогу протестировать создание и обновления таким же образом, верно?

Например, если у меня есть такой же код для collection "tickets":

describe('POST - /api/admin/tickets', () => {
        it('Should create a ticket', done => {
            const ticket: ITicket = {
                owner: 'tdd@test.com',
                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('tdd@test.com');
                    response.body.should.have.property('ok').eq(true);
                    done();
                });
        });
   });

Тогда предыдущий сгенерированный тикет имеет свойство ID с неизвестным значением, поэтому я должен проверить «метод PUT» для другого тикета с известным ID?

1 Ответ

0 голосов
/ 04 апреля 2020

Я знаю, что это не решение, а обходной путь. Я думаю, что это даже не хорошая практика, но она работает.

Сначала я добавил 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"
  },

Я только добавил идентификатор в 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);
    }
...