Тестирование Обещаний с несколькими моментами с использованием testdoublejs

Я использую testdouble для озвучивания вызовов в моем проекте node.js. Эта конкретная функция упаковывает обещание и имеет несколько then вызовы внутри самой функции.

function getUser (rethink, username) {
  return new Promise((resolve, reject) => {
  let r = database.connect();
  r.then(conn => database.table(tablename).filter({username}))
   .then(data => resolve(data))
   .error(err => reject(err));
 });
}

Поэтому я хочу определить, является ли resolve а также reject обрабатываются правильно на основе условий ошибки. Предположим, есть какая-то нестандартная логика, которую мне нужно проверить.

Для моего теста

import getUser from './user';
import td from 'testdouble';
test(t => {
  const db = td.object();
  const connect = td.function();
  td.when(connect('options')).thenResolve();
  const result = getUser(db, 'testuser');
  t.verify(result);
}

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

Строка, к которой он относится, является результатом database.connect() это не обещание

TypeError: Cannot read property 'then' of undefined

У кого-нибудь есть успех с озвучиванием этого типа звонка с помощью Test Double?

2 ответа

Решение

Так разобрался в резолюции. В решении есть несколько моментов, с которыми мы столкнулись. Короче говоря, резолюция оказалась такой...

td.when(database.connect()).thenResolve({then: (resolve) => resolve('ok')});

Это разрешает таблицу, возвращаемую, когда test double видит соединение с базой данных. Затем последующие звонки также могут быть добавлены.

Если вы отправляете объект на database.connect() Вы должны знать, что это делает === проверка на равенство, и вам нужно иметь ссылку на этот объект для его правильного использования td.when,

Test double предоставляет заглушки для модульного тестирования. И в вашем случае "db" - это объект, который нам нужно высмеивать. Создание насмешливой БД через

td.object(Database) // Database is the class or constructor of your db

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

Вот протестированный модуль, some.js:

function getUser (database, username) {
  return new Promise((resolve, reject) => {
    let r = database.connect();
    r.then(conn => database.table('table').filter({username:username}))
      .then(data => resolve(data))
      .catch(err => reject(err));
  });
}

module.exports = getUser;

И тестовый файл, использующий mocha и chai.expect, который также может быть любым другим модулем модульного тестирования здесь:

let td = require('testdouble');
let expect = require('chai').expect;

const getUser = require('./some');

describe('some.js',()=>{
  it('getUser',()=>{
    const db = {};
    const name = 'name';
    db.connect = td.function();
    db.table = td.function('table');
    db.filter = td.function('filter');
    td.when(db.connect()).thenResolve(db);
    td.when(db.table('table')).thenReturn(db);
    td.when(db.filter({username: name})).thenResolve('some user data');
    return getUser(db, name)
      .then(user=>{
        expect(user).to.equal('some user data')
      })
      .catch(e=>assert(e))
  })
})

Поэтому, пожалуйста, дайте мне знать, если что-то из этого вас смущает.

Другие вопросы по тегам