Я уже некоторое время пытался найти ответ на эту проблему, но мне это не удалось.Поэтому я решил попробовать здесь.Если такой вопрос уже есть, и я пропустил его, прошу прощения за дубликат.
Предположим, у меня есть этот модуль javascript 'myValidator.js', где две функции, и одна функция вызывает другую.
export const validate = (value) => {
if (!value.something) {
return false
}
// other tests like that
return true
}
export const processValue = (value) => {
if (!validate(value)) {
return null
}
// do some stuff with value and return something
}
Проверьте это следующим образом.Я хочу проверить функцию проверки, правильно ли она ведет себя.И тогда у меня есть функция processValue, которая вызывает первое и возвращает некоторое значение, когда проверка правильна или равна нулю.
import * as myValidator from './myValidator'
describe('myValidator', () => {
describe('validate', () => {
it('should return false when something not defined', () => {
...
}
}
describe('processValue', () => {
it('should return something when value is valid', () => {
const validateMock = jest.spyOn(myValidator, 'validate')
validateMock.mockImplementation(() => true)
expect(validate('something')).toEqual('somethingProcessed')
}
it('should return null when validation fails', () => {
const validateMock = jest.spyOn(myValidator, 'validate')
validateMock.mockImplementation(() => false)
expect(validate('somethingElse')).toEqual(null)
}
}
}
Теперь проблема в том, что это на самом деле не работает, так как processValue()
фактически вызываетфункция внутри модуля, из-за замыкания, я полагаю.Таким образом, функция не является поддельной, так как, я думаю, только ссылка в экспорте заменяется на шутливую.
Я нашел решение для этого и внутри модуля использовать
if (!exports.validate(value))
, который работает для тестов.Однако мы используем Webpack (v4) для сборки приложения, поэтому оно преобразует эти экспорты в свою собственную структуру, а затем при запуске приложения exports
не определяется и код завершается ошибкой.
Какое лучшее решениечтобы проверить это?
Конечно, я могу сделать это с предоставлением некоторого действительного и недействительного значения, для этого простого случая, который будет работать, однако я считаю, что его следует проверять отдельно.
Или лучшечтобы не издеваться над функциями и не вызывать их, чтобы избежать возникшей у меня проблемы или есть какой-то способ, как этого добиться с помощью модулей JavaScript?