Я хочу протестировать приведенный ниже код, но не знаю, как проверить эту функцию, поскольку она возвращает функцию с параметрами. Вы можете видеть на изображении, что я пытаюсь достичь 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
})
Почему бы не перевернуть его, не ожидая, что он не выдаст ошибку?
Похоже, вам нужно вызвать его, получить возвращенную функцию, а затем выполнить тест с возвращенной функцией (возможно, насмехаясь над ее аргументами), чтобы вы могли увидеть, выполняет ли возвращенная функция то, что она должна, при ее выполнении.
Я не понимаю, что возвращаемая функция выглядит так, как будто это будет промежуточное ПО Express, но она не работает с req, res и не вызывает next(), поэтому не похоже, что это действительное промежуточное ПО.
@ jfriend00 это экспресс-промежуточное ПО, и в функции jwt() есть волшебство, которое происходит отсюда github.com/auth0/express-jwt
Просто не похоже, что validateJwt() написан правильно. Вроде как надо делать return jwt(...), а не return (req, res, next) => { jwt() }. jwt() возвращает функцию промежуточного программного обеспечения напрямую, и вам нужно, чтобы эта функция вызывалась. Ваш validateJwt() не будет вызывать эту функцию, фактически он игнорирует возвращенную функцию промежуточного программного обеспечения.
Нет, я абсолютно хочу, чтобы метод так называли. Он позволяет мне передать параметр функции, которая будет использоваться, но все же возвращает функцию с сигнатурой, которая выражает потребности промежуточного программного обеспечения (то есть function (req, res, next))



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Хорошо, так что две вещи.
Во-первых, в вашем тесте вам нужно выполнить возвращенную функцию, а не тестировать ее напрямую. К сожалению, я разговариваю по телефону и сейчас не могу указать почтовый индекс.
Во-вторых, ваша возвращенная функция ничего не возвращает, а просто вызывает функцию jwt. Это не обязательно проблема. Пока jwt () обновляет какой-либо объект или переменную в вашем тестовом пространстве, вы можете проверить текущее состояние этого объекта / переменной в своем тесте вместо того, чтобы напрямую запрашивать функцию.
Я считаю, что внутри jwt() вызывает next(). Но как я должен протестировать возвращенную функцию?
Для этого типа теста мы можем следить за вызовом функции 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 не является свойством «чего-то».
Похоже, это сработает, хотя я действительно надеялся, что мне не придется вводить proxyquire и писать тест, просто используя sinon, если это возможно.
@Catfish, да, я бы тоже мог использовать Синон. Это из-за jwt. Другая альтернатива, возможно, вы можете создать модуль абстракции для этого jwt, и мы, вы используете этот модуль в своем коде, тогда мы можем протестировать только его, просто используя Sinon.
Единственное, что я мог придумать, - это внедрить метод jwt, передав его в метод. Это позволило бы мне просто использовать sinon для тестирования, но мешает потребителю использовать validateJwt.
Что ж, результатом будет функция, поэтому вам нужно будет вызвать ее, я думаю, - за исключением, конечно, функции, возвращаемой
validateJwt, это функция, которая в любом случае будет возвращать толькоundefined, поэтому ваш тест всегда будет терпеть неудачу