Bcrypt.com не выполняет в тестах chai / mocha, а выполняет в коде - PullRequest
0 голосов
/ 18 сентября 2018

В моем проекте есть некоторый бэкэнд node.js.Для шифрования паролей я использую bcrypt .Для сравнения строкового пароля из запроса с хешированным паролем в БД я использую функцию bcrypt.compare.Моя функция bcrypt.compare хорошо работает в коде.Я проверил это вручную с почтальоном, и он хорошо работает в производстве.Но в тестах с chai-http и mocha он зависает.

Тест.Я использую mocha с chai-http, чтобы сделать запрос HTTP POST:

describe('Testing login', () => {
  it('should return status 200 when there is such user in DB and password is correct', (done) => {
    chai.request(server)
    .post('/login')
    .send({
      login: 'test@test.test',
      password: 'somepassword'
    })
    .end((err, res) => {
      res.should.have.status(200)
      done()
    })
  })
})

Функция bcrypt контроллера выглядит так:

async function auth (req, res) {
  let { login, password } = req.body
  try {
    let payload = {}
    let result = {}
    await
    User.findOne({ where: { userEmail: login } }).then(user => {      
      return result = user
    })
    bcrypt.compare(password, result.dataValues.password, await function (err, data) {
      if (err) {        
        throw Error(err)
      }
      if (result && data) {       
        payload.isAdmin = result.dataValues.isAdmin
        payload.ID = result.dataValues.id
        let token = jwt.sign(payload, 'yoursecret')
        res.status(200).send({ token: token })
      } else { res.status(401) }
    })
  } catch (error) {
    res.sendStatus(500)
  }
}

Есть ли способ проверить эту функцию?

Дополнительная информация
mocha версия 5.2.0 - глобальная и локальная
узел v8.11.4
windows 10 x64

"devDependencies": {
  "@types/chai-as-promised": "^7.1.0",
  "chai": "^4.1.2",
  "chai-as-promised": "^7.1.1",
  "chai-http": "^4.2.0",
  "eslint": "^5.5.0",
  "eslint-config-standard": "^12.0.0",
  "eslint-plugin-import": "^2.14.0",
  "eslint-plugin-node": "^7.0.1",
  "eslint-plugin-promise": "^4.0.1",
  "eslint-plugin-standard": "^4.0.0",
  "express-unit": "^2.1.1",
  "mocha": "^5.2.0",
  "mock-express-request": "^0.2.2",
  "mock-express-response": "^0.2.2",
  "nyc": "^13.0.1",
  "proxyquire": "^2.1.0",
  "sinon": "^6.2.0",
  "supertest": "^3.3.0",
  "ws": "3.3.2"
}

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

Неправильное поведение не было связано с chai / mocha / bcript.Это было вызвано следующим утверждением

    } else {
        res.status(401)
    }

правильный код должен быть

    } else {
        res.status(401).send(something)
    }

или

    } else {
        res.sendStatus(401)
    }

Я думаю, что Express ожидает .send () после .status() и сохраняйте соединение без ответа

0 голосов
/ 19 сентября 2018

Я считаю, что есть несколько проблем и несколько мест для поиска ресурсов. Я не верю, что это проблема с chai-http.

MDN async/await функции
Использование bcrypt с Обещаниями.

Вот переписанная версия вашего обработчика маршрута:

async function auth(req, res) {
    let {
        login,
        password
    } = req.body
    try {
        let payload = {}
        let result = await User.findOne({
            where: {
                userEmail: login
            }
        });
        const data = await bcrypt.compare(password, result.dataValues.password);

        if (result && data) {
            payload.isAdmin = result.dataValues.isAdmin
            payload.ID = result.dataValues.id
            let token = jwt.sign(payload, 'yoursecret')
            res.status(200).send({
                token: token
            })
        } else {
            res.sendStatus(401)
        }
    } catch (error) {
        res.sendStatus(500)
    }
}

Я не уверен, как вы настраиваете свои маршруты, но распространенной ошибкой является неправильная обработка асинхронных функций, , поскольку express не делает этого за вас.

Дайте мне знать, если это поможет. Также было бы полезно узнать, как вы инициализируете маршруты и используемые вами версии Node, Express, chai-http, bcrypt и jsonwebtoken.

...