Как смоделировать / перехватить вызовы к атласу mongoDB во время тестов? (облачная БД) - PullRequest
0 голосов
/ 25 июня 2019

У меня есть экспресс-приложение (REST API), которое подключается к кластеру mongoDB в MongoDB Atlas (облачная база данных) во время тестов. Я использую Мокко для тестирования.

У меня есть сквозной тест (который использует базу данных), но для большинства тестов я хочу смоделировать / заглушить вызовы к базе данных, чтобы она была изолированной.

Я пытался использовать nock для перехвата сетевых подключений и проверки ответа, но из того, что я вижу, nock только для вызовов http, а mongoDB Atlas использует DNS (начинается с mongodb+srv:, см. здесь для получения дополнительной информации) и я думаю, именно поэтому я не могу заставить это работать.

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

// The route 
router.post('/test', async (req, res) => {
  const { name } = req.body;

  const example = new ExampleModel({ name: name})

  // this should be mocked
  await example.save();

  res.status(200);
});

// The test
describe('POST /example', () => {
  it('Creates an example', async () => {
    // using supertest to make http call to my API app 
    const response = await request(app)
      .post('/test')
      .type("json")
      .send({ 'name': 'test-name' })

    // expect the model to have been created and then saved to the database
  });
});

Я ожидаю, что при запуске теста он выполнит POST для API, который не сделает вызов базы данных, но вернет поддельные данные (как если бы это было) .

1 Ответ

0 голосов
/ 26 июня 2019

Я нашел несколько действительно полезных ресурсов и поделился ими:

  • Изоляционные мангустные тесты (включая методы моделирования, такие как findOne , руководство
  • Использование метода save для модели: Создание метода сохранения мангусты для модели (я только что использовал `sinon.stub (ExampleModel.prototype, 'save').

    // пример кода it ('возвращает код состояния 400', async () => { sinon.stub (ExampleModel, 'findOne'). return ({имя: 'testName'}); const saveStub = sinon.stub (ExampleModel.prototype, 'save');

      const example = new ExampleModel({ name: 'testName' })
    
      const response = await request(app)
        .post('/api/test')
        .type("json")
        .send({ name: 'testName' })
    
    sinon.assert.calledWith(Hairdresser.findOne, {
          name: 'testName'
      });
    
      sinon.assert.notCalled(saveStub)
    
      assert.equal(response.res.statusCode, 400);
    });
    
...