Тестирование с использованием Mocha и Chai, использующих значения предыдущих тестов - PullRequest
0 голосов
/ 02 июля 2018

У меня есть несколько тестов, созданных с mocha и chai с использованием TypeScript, они на самом деле работают, как и ожидалось. Каждая функция возвращает Promise, который выполняет test.

У меня вопрос: есть ли в любом случае значение для каждого test значения, возвращенного предыдущим test без использования вложенности, которую вы видите ниже.

Меня беспокоит то, что если у меня будет больше test, то код вложения может быть очень раздражающим, если идти вправо

import * as request from 'supertest';
import app from '../src/app';
import { Promise } from 'bluebird';
import * as dateformat from 'dateformat';
import Commons from '../../utils/commons';
import { expect } from 'chai';

...
// all the functions used below are defined over here
...

registerNonExistingUser(email, pass, role).then(
    (jwtToken: string) => {
        authenticateUserCorrectJwt(jwtToken).then(
            (user) => {
                authenticateUserWrongJwt().then(
                    () => {
                        loginUserWrongCredentials().then(
                            () => {
                                loginUserCorrectCredentials(email, pass).then(
                                    (jwtToken: string) => {
                                        getLocalUserInfoCorrectJwt(jwtToken, email).then(
                                            (user) => {
                                                createTodoAsEditor(jwtToken, todoTitle).then(
                                                    (todos) => {
                                                        checkTodoExistsWithCorrectTitle(jwtToken, todoTitle).then(
                                                            (todo: any) => {
                                                                deleteTodoWithCorrectIdAsEditor(jwtToken, todo._id).then(
                                                                    (todo) => {
                                                                        unregisterExistingUser({
                                                                            'local.email': email,
                                                                        }).then(
                                                                            (user) => {
                                                                                // console.log(Commons.stringify(user));
                                                                            }
                                                                        );
                                                                    }
                                                                );
                                                            }
                                                        );
                                                    }
                                                );
                                            }
                                        );
                                    }
                                );
                            }
                        );
                    }
                );
            }
        );
    }
);

Есть идеи, как это украсить?

[ПРАВИТЬ 1]

@ bhoo-day предложение сработало:

registerNonExistingUser(email, pass, role)
    .then((_jwtToken: string) => { 
        return authenticateUserCorrectJwt(_jwtToken);
    })
    .then((user) => {
        return authenticateUserWrongJwt();
    })
    ...

Теперь мне интересно, смогу ли я преобразовать начало цепочки, чтобы получить что-то вроде следующего (что я пробовал, но не работает). Моя цель - поставить все функции на одном уровне, включая самую первую функцию:

Promise.resolve()
    .then(() => { 
        return registerNonExistingUser(email, pass, role);
    })
    .then((jwtToken: string) => { 
        return authenticateUserCorrectJwt(jwtToken);
    })
    .then((user) => {
        return authenticateUserWrongJwt();
    })
    ...

[РЕДАКТИРОВАТЬ 2]

Я попробовал следующее, и это работает. Есть ли у вас какие-либо идеи о том, как это упростить? Может быть, с помощью: Promise.resolve()...?

new Promise((resolve) => {
    it('dummy', (done) => { resolve(); return done(); });
})
.then(() => { 
    return registerNonExistingUser(email, pass, role);
})
.then((_jwtToken: string) => { 
    return authenticateUserCorrectJwt(_jwtToken);
})

Спасибо!

1 Ответ

0 голосов
/ 02 июля 2018

Если вы используете обещание, вы можете избежать этого ада обратного вызова, потому что это главная цель обещания.

Некоторые идеи для решения проблемы.

// temp variable to store jwt token
let token;

registerNonExistingUser(email, pass, role)
  .then((jwtToken: string) => { 
    token = jwtToken; // assign it so other functions can use it
    return authenticateUserCorrectJwt(jwtToken)
  })
  .then((user) => authenticateUserWrongJwt())
  .then(() => loginUserWrongCredentials())
  .then(() => loginUserCorrectCredentials(email, pass))
  .then((jwtToken: string) => getLocalUserInfoCorrectJwt(jwtToken, email))
  .then((user) => createTodoAsEditor(token, todoTitle))
  .then((todos) => checkTodoExistsWithCorrectTitle(token, todoTitle))
  .then((todo: any) => deleteTodoWithCorrectIdAsEditor(token, todo._id))
  .then((todo) => unregisterExistingUser({ 'local.email': email }))
  .then((user) => {
    // console.log(Commons.stringify(user));
  });

или, если вы используете узел 7.6.0 или выше, вы можете использовать async / await. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/await

async function printUser() {    
    try { 
      let jwtToken = await registerNonExistingUser(email, pass, role);
      const user = await authenticateUserCorrectJwt(jwtToken);

      await loginUserWrongCredentials();
      jwtToken = await loginUserCorrectCredentials(email, pass);
      const user = await getLocalUserInfoCorrectJwt(jwtToken, email);
      const todos = await createTodoAsEditor(token, todoTitle);
      const todo = await checkTodoExistsWithCorrectTitle(token, todoTitle)

      const todo = await deleteTodoWithCorrectIdAsEditor(token, todo._id);
      const user = await unregisterExistingUser({ 'local.email': email });

      console.log(Commons.stringify(user));
    } catch (error) {
      // catch error here
    }
}
...