Как проверить функцию, которая возвращает функцию с параметрами?

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

const jwt = require('express-jwt')

function validateJwt (tokenConfig) {
  if (!tokenConfig || !tokenConfig.secret) {
    throw new TypeError('tokenConfig param must be defined and have attribute "secret"')
  }

  return (req, res, next) => {
    jwt(_.extend({}, tokenConfig, {
      requestProperty: 'tkn',
      getToken: ReqHelpers.getEitherTkn
    }))
  }
}

Метод тестирования, который явно не работает с ошибкой AssertionError: expected [Function] to be true

it('should succeed', () => {
  let result = middleware.validateJwt({secret: 'foo'})
  expect(result).to.be.true
})

Как проверить функцию, которая возвращает функцию с параметрами?

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

Jaromanda X 24.07.2018 03:05

Почему бы не перевернуть его, не ожидая, что он не выдаст ошибку?

JohanP 24.07.2018 03:06

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

jfriend00 24.07.2018 03:19

Я не понимаю, что возвращаемая функция выглядит так, как будто это будет промежуточное ПО Express, но она не работает с req, res и не вызывает next(), поэтому не похоже, что это действительное промежуточное ПО.

jfriend00 24.07.2018 03:21

@ jfriend00 это экспресс-промежуточное ПО, и в функции jwt() есть волшебство, которое происходит отсюда github.com/auth0/express-jwt

Catfish 24.07.2018 17:04

Просто не похоже, что validateJwt() написан правильно. Вроде как надо делать return jwt(...), а не return (req, res, next) => { jwt() }. jwt() возвращает функцию промежуточного программного обеспечения напрямую, и вам нужно, чтобы эта функция вызывалась. Ваш validateJwt() не будет вызывать эту функцию, фактически он игнорирует возвращенную функцию промежуточного программного обеспечения.

jfriend00 24.07.2018 21:57

Нет, я абсолютно хочу, чтобы метод так называли. Он позволяет мне передать параметр функции, которая будет использоваться, но все же возвращает функцию с сигнатурой, которая выражает потребности промежуточного программного обеспечения (то есть function (req, res, next))

Catfish 25.07.2018 06:04
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
7
207
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Хорошо, так что две вещи.

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

Во-вторых, ваша возвращенная функция ничего не возвращает, а просто вызывает функцию jwt. Это не обязательно проблема. Пока jwt () обновляет какой-либо объект или переменную в вашем тестовом пространстве, вы можете проверить текущее состояние этого объекта / переменной в своем тесте вместо того, чтобы напрямую запрашивать функцию.

Я считаю, что внутри jwt() вызывает next(). Но как я должен протестировать возвращенную функцию?

Catfish 24.07.2018 06:28
Ответ принят как подходящий

Для этого типа теста мы можем следить за вызовом функции jwt и проверять ее аргументы.

Обновлено:

поскольку функция возврата express-jwt, нам нужно задействовать proxyquire для отслеживания функции. Ссылка: https://github.com/thlorenz/proxyquire

Вы можете сделать что-то вроде этого:

const proxyquire = require('proxyquire');
const sinon = require('sinon');

const jwtSpy = sinon.spy();
const middleware = proxyquire('./middleware', { 'express-jwt': jwtSpy }); // 'express-jwt' comes from your require statement for this package

it('should call jwt', () => {
  const req = sinon.spy();
  const res = sinon.spy();
  const next = sinon.spy();  

  middleware.validateJwt({secret: 'foo'})(req, res, next);

  expect(jwtSpy.called).to.be.ok;
  expect(jwtSpy.calledWithArg({ secret: 'foo', requestProperty: 'tkn'}).to.be.ok; // for checking the arguments
})

Надеюсь, поможет

Я не слежу за тем, как sinon.spy(something, 'jwt') должен работать с моей данной функцией, поскольку jwt не является свойством «чего-то».

Catfish 24.07.2018 17:09

Похоже, это сработает, хотя я действительно надеялся, что мне не придется вводить proxyquire и писать тест, просто используя sinon, если это возможно.

Catfish 25.07.2018 17:38

@Catfish, да, я бы тоже мог использовать Синон. Это из-за jwt. Другая альтернатива, возможно, вы можете создать модуль абстракции для этого jwt, и мы, вы используете этот модуль в своем коде, тогда мы можем протестировать только его, просто используя Sinon.

deerawan 26.07.2018 00:06

Единственное, что я мог придумать, - это внедрить метод jwt, передав его в метод. Это позволило бы мне просто использовать sinon для тестирования, но мешает потребителю использовать validateJwt.

Catfish 26.07.2018 01:09

Другие вопросы по теме