Как шпионить за ejs рендером с помощью sinon - PullRequest
0 голосов
/ 29 октября 2018

Я хочу проверить, вызывается ли res.render с правильными аргументами.

 it("Renders the page where a new user can be created", done => {
    const spy = sinon.spy(ejs, "render");
    chai
      .request(app)
      .get("/users/create")
      .end((err, res) => {
        res.should.have.status(200);
        spy.should.have.been.calledOnce;
        done();
      });
  });

Даже несмотря на то, что вызывается функция рендеринга, отчет об испытаниях говорит мне, что функция рендеринга никогда не вызывается.

 Uncaught AssertionError: expected render to have been called exactly once, but it was called 0 times

Как я могу следить за функцией рендеринга ejs, которая вызывается у объекта ответа, и утверждать, вызывается ли он с правильными аргументами?

РЕДАКТИРОВАТЬ: наш проект использует express-ejs-layouts для рендеринга файлов ejs

1 Ответ

0 голосов
/ 29 октября 2018

Если вы звоните res.render() с использованием EJS, вызывается не ejs.render(), а ejs.renderFile() ( источник ).

Следуя пути кода для этого метода, он никогда не вызывает ejs.render().

Шпионаж на ejs.renderFile() также невозможен, поскольку Sinon работает (шпионаж на ejs.renderFile заменяет экспортированную ссылку на метод renderFile, но ejs использует внутренний ссылка).

Однако вы можете шпионить за ejs.__express - функцией, которую Express будет вызывать для res.render():

const spy = sinon.spy(ejs, "__express");

РЕДАКТИРОВАТЬ : Теперь я понимаю, что вы хотите убедиться, что res.render() вызывается с правильными аргументами, поэтому было бы более разумно следить за этим методом:

const { response } = require('express');

...

const spy = sinon.spy(response, 'render');
...