Bcrypt.compare不是在chai / mocha测试中执行,而是在代码中执行

时间:2018-09-18 11:16:00

标签: javascript express mocha chai bcrypt

我的项目中有一些node.js后端。为了加密密码,我使用bcrypt。为了比较数据库中来自requst的字符串密码和哈希密码,我使用bcrypt.compare函数。我的bcrypt.compare函数在代码中效果很好。我使用Postman对其进行了手动测试,并且在生产中运行良好。但是在使用 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)
  }
}

有什么方法可以测试此功能?

其他信息
摩卡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 :(得分:0)

我相信这里存在一些问题,并且在一些地方可以找到资源。我不认为这是chai-http的问题。

MDN async/await functions
Using bcrypt with Promises.

这是路由处理程序的重写版本:

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)
    }
}

我不确定您如何设置路由,但是一个常见的错误是无法正确处理异步功能as express doesn't do this for you.

让我知道是否有帮助。看看如何初始化路由以及正在使用的Node,Express,chai-http,bcrypt和jsonwebtoken的版本也将很有帮助。

答案 1 :(得分:0)

错误的行为与chai / mocha / bcript没有关联。这是由于以下陈述引起的

JobScheduler

正确的代码应为

    } else {
        res.status(401)
    }

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

我认为Express在.status()之后等待.send()并保持连接无响应