在Express路线中监视功能调用

时间:2018-04-08 09:37:34

标签: javascript unit-testing jestjs

更新

为了集中讨论下面的问题,我将测试更改为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模块?

1 个答案:

答案 0 :(得分:0)

缺少一个“ c”。在路由器中,您正在呼叫sendmail.welomeEmail();而不是sendmail.welcomeEmail();