Следите за вызовами функций в экспресс-маршруте

avatar
Hyra
8 апреля 2018 в 09:37
618
1
0

ОБНОВЛЕНИЕ:

Чтобы сосредоточиться на проблеме ниже, я изменил тест на test.only. Когда я изменил его обратно, чтобы запустить все тесты, он работал отлично.


В моем экспресс-приложении я отправляю приветственное письмо пользователю, когда он регистрируется.

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

Я использую Jest в качестве тестовой среды, но я думаю, что проблема не зависит от среды.

Мой маршрут (упрощенный):

const sendmail = require('../sendmail');

router.post("/register", function(req, res) {
    // Some validation and DB work

    sendmail.welomeEmail();

    res.send({ success: true, message: 'Signed up succesfully' });
})

И мой тест:

test("it should send a welcome email", done => {
  const sendmail = require("../sendmail");
  const spy = jest.spyOn(sendmail, "welcomeEmail");

  return request(app)
    .post("/register")
    .send({
      // User data
    })
    .then(response => {
      expect(response.statusCode).toBe(200);
      expect(response.body.success).toBeTruthy();
      expect(response.body.message).toBe("Signed up succesfully");
      expect(spy).toHaveBeenCalled(); // This doesn't get called
      done();
    });
});

Когда я выполняю этот точный тест, создавая файл, который вызывает метод, он работает отлично, поэтому я предполагаю, что это происходит потому, что он выполняет request и фактически не вызывает метод маршрутизатора.

Как можно решить подобную ситуацию, когда я хочу убедиться, что модуль sendmail используется в маршруте?

Источник
gillyhl
8 апреля 2018 в 09:50
0

Как ваше экспресс-приложение сделано в тесте?

Hyra
8 апреля 2018 в 10:14
0

Вверху он включен const app = require("../server/app");, который экспортирует экспресс-экземпляр (на самом деле он не запускается с .listen) туда

gillyhl
8 апреля 2018 в 10:34
1

Я помню, что у меня тоже была эта проблема. Кажется, я исправил это, создав экспресс-приложение в тесте, а не импортировав его из вашей фактической реализации, затем импортировав тестируемый маршрут и включив его в поддельное экспресс-приложение для использования в супертесте.

Hyra
8 апреля 2018 в 11:46
0

Интересно, я использовал test.only, чтобы сосредоточиться на исправлении. Когда я изменил его обратно на test, все заработало, как и ожидалось. Любопытный ..

gillyhl
8 апреля 2018 в 11:50
0

Удивительно :D javascript во всей красе

Hyra
8 апреля 2018 в 11:52
1

Ха-ха, действительно =) Спасибо, что пошутили со мной.

Ответы (1)

avatar
Julian
8 июля 2020 в 09:39
0

Отсутствует буква "с". В роутере вы звоните sendmail.welomeEmail(); вместо sendmail.welcomeEmail();