Пробный вызов в Typescript в модульном тесте с использованием только Mocha - PullRequest
0 голосов
/ 09 марта 2020

У меня есть следующий метод:

import { ObjectDal } from "./ObjectDal";

export class ObjectBL {
  async getObject(id) {
      try {
          let dal = new ObjectDal();

          let result = await dal.get(id);

          return result;

      } catch (err) {
          // log the error
      }
}

, где класс ObjectDal:

export class ObjectDal {
    async get(id) {
        // open connection to db
        // make a query based on id

        // put the result in a `result` variable

        return result;
    }
}

Я должен написать модульный тест для метода getObject(), используя только Мокко ...

Это начало UT:

const assert = require('assert');
const ObjectBL = require("../ObjectBL");

describe('Something', () => {
    describe('...', () => {
        it('getObject_GetsObjectUsingID_True', async () => {
            // arange
            let id = "123456789101";
            let expected = {
                "name": "ana",
                "hasApples": true
            };

            let test = new ObjectBL.ObjectBL();

            let result = await test.getObject(id);

            assert.deepStrictEqual(result, expected);
        });
    });
});

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

Как я могу издеваться над вызовом метода get(), используя только Мокко?

Я нашел ответы с помощью Синона или Мокко с Синоном и / или Чайем ... но ничего только с мокко ...

Ответы [ 2 ]

0 голосов
/ 09 марта 2020

Тестирование - это обратная связь, не только о том, работает ли ваш код как рекламируется, но еще более важно о качестве вашего дизайна .

Тот факт, что у вас возникают проблемы при написании тесты - это ваш первый признак того, что вы сделали что-то неоптимальное в реализации. То, что вы хотите, это this :

export class ObjectBL {
  constructor (dal) {
      this.dal = dal;
  }

  async getObject(id) {
      try {
          let result = await this.dal.get(id);

          return result;

      } catch (err) {
          // log the error
      }
}

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

0 голосов
/ 09 марта 2020

Прокси может быть для вас путь к go. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy

Мок методы можно использовать с помощью прокси-сервера, например:

const assert = require('assert');
const ObjectBL = require("../ObjectBL");

describe('Something', () => {
    describe('...', () => {
        it('getObject_GetsObjectUsingID_True', async () => {
            // arange
            let id = "123456789101";
            let expected = {
                "name": "ana",
                "hasApples": true
            };

            let test = new ObjectBL.ObjectBL();
            
            const handler = {
              get: function(obj, prop) {
                // mok the getObject method
                if(prop === 'getObject'){
                  return () => {
                    return Promise.resolve({
                        "name": "ana",
                        "hasApples": true
                    });
                   }
                } else {
                  return obj[prop];
                }
              }
            };
            const p = new Proxy(test, handler);

            let result = await p.getObject(id);

            assert.deepStrictEqual(result, expected);
        });
    });
});

Если вы ТОЛЬКО хотите использовать метод ObjectDal.get, вы можете переопределить прототип и впоследствии восстановить его:

const assert = require('assert');
const ObjectBL = require("../ObjectBL");
const ObjectDal = require("../ObjectDal");

describe('Something', () => {
    describe('...', () => {
        it('getObject_GetsObjectUsingID_True', async () => {
            // arange
            let id = "123456789101";
            let expected = {
                "name": "ana",
                "hasApples": true,
            };
            
            const proto = Object.getOwnPropertyDescriptor(ObjectDal, 'prototype').value;
            
            const backup = proto.get;
            proto.get = () => {
              return Promise.resolve({
                  "name": "ana",
                  "hasApples": true,
              });
            }

            let test = new ObjectBL.ObjectBL();

            let result = await test.getObject(id);
            
            ObjectDal.prototype.get = backup;
            
            assert.deepStrictEqual(result, expected);
        });
    });
});

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...