首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mocha + chai试验

Mocha + chai试验
EN

Code Review用户
提问于 2018-08-10 22:21:17
回答 1查看 270关注 0票数 1

我一直在努力在代码中添加相当数量的单元测试。然而,我发现自己在很大程度上违背了枯燥的原则。

我目前正在使用以下文件夹结构中的测试在API上运行测试:

代码语言:javascript
复制
/user
  user.model.js
  user.test.js
  ....
/blog
  blog.model.js
  blog.test.js
....

我一直在脚本测试路径中使用通配符来锁定我的所有测试文件nodemon --exec 'mocha ../api/resources/**/*.test.js'

我注意到我所有的测试文件都有很多需要的东西。大多数测试文件在每个测试文件中都是相同的,例如:

代码语言:javascript
复制
const chai = require('chai')
const chaiHttp = require('chai-http')
const { expect } = chai
const app = require('../../../app')
const { dropDb } = require('../../../test/helpers')

const mongoose = require('mongoose')
const User = mongoose.model('user')

chai.use(chaiHttp)

我的测试中有很多重复的“expect”语句

代码语言:javascript
复制
it('should return error when no user email found', async () => {
    const result = await chai.request(app)
        .post('/api/user/login')
        .send({ email: 'fail@email.com', password: currentUserData.password })

    *expect(result).to.have.status(401)
    expect(result.error).to.exist
    expect(result.error.text).to.contain('No user found')*
})

it('should return error when password is incorrect', async () => {
    const result = await chai.request(app)
        .post('/api/user/login')
        .send({ email: currentUserData.email, password: '123456' })

    *expect(result).to.have.status(401)
    expect(result.error).to.exist
    expect(result.error.text).to.contain('Incorrect password')*
})

从上面的测试中可以看到,expect语句基本上是相同的,减去文本。我还有很多其他的测试,我希望检查能确保它的JSON数据或200在更具体的期望之前。

对我来说,这感觉好像我在要求和期望语句上重复了很多次。这是标准实践吗?或者我可以创建某种更高级的函数来运行测试,而不必一直要求。

此外,我是否可以重用一个函数,其中包含类似的expect语句?

EN

回答 1

Code Review用户

回答已采纳

发布于 2018-08-11 12:45:59

推荐的测试技术之一是将重构转换为assert方法。重复会导致脆弱的测试。

您还应该尝试为SUT创建工厂方法。

代码语言:javascript
复制
it('should return error when password is incorrect', async () => {
    // Arrange
    const aValidEmail = currentUserData.email
    const aWrongPassword = '123456'

    // Act
    const result = await makeLoginRequest(aValidEmail, aWrongPassword)

    // Assert
    expectErrorResult(401, 'Incorrect password')
})

编辑:最后,makeLoginRequest()不是一个工厂方法,但它可能是这种类型SUT的等效方法。我们在这里试图实现的是避免在SUT修改其接口时修改测试(比如端点或添加/删除不相关的参数)。

票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/201429

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档