ОБНОВЛЕНИЕ:
Чтобы сосредоточиться на проблеме ниже, я изменил тест на 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 используется в маршруте?
Как ваше экспресс-приложение сделано в тесте?
Вверху он включен
const app = require("../server/app");
, который экспортирует экспресс-экземпляр (на самом деле он не запускается с .listen) тудаЯ помню, что у меня тоже была эта проблема. Кажется, я исправил это, создав экспресс-приложение в тесте, а не импортировав его из вашей фактической реализации, затем импортировав тестируемый маршрут и включив его в поддельное экспресс-приложение для использования в супертесте.
Интересно, я использовал
test.only
, чтобы сосредоточиться на исправлении. Когда я изменил его обратно наtest
, все заработало, как и ожидалось. Любопытный ..Удивительно :D javascript во всей красе
Ха-ха, действительно =) Спасибо, что пошутили со мной.