如何将 chai-things 和 chai-like 结合起来?

Posted

技术标签:

【中文标题】如何将 chai-things 和 chai-like 结合起来?【英文标题】:How can I combine chai-things and chai-like? 【发布时间】:2016-10-03 09:56:16 【问题描述】:

我想编写一个 NodeJS chai 测试来检查某些服务调用(它是一个数组)的结果是否包含一个与我期望的对象相等的对象。结果中可能还有一些我不想检查的字段。

有两个 chai 插件可以解决这个问题:chai-things(允许您使用类似expect(i).to.include.something.that.deep.equals 的语法)和chai-like(允许您使用类似expect(i).to.be.like 的语法)。

但是,它们组合起来不起作用。

查看这个最小的工作示例:

const chai = require('chai')
const expect = chai.expect
chai.use(require('chai-things'))
chai.use(require('chai-like'))

describe('the chai setup', function() 
  it('should work', function(done) 
    const i = [
      name: 'Name A',
      age: 1
    , 
      name: 'Name B',
      age: 2
    ]

    // Works
    expect(i).to.include.something.that.deep.equals(
      name: 'Name B',
      age: 2
    )

    // Works
    expect(i[1]).to.be.like(
      name: 'Name B'
    )

    // Doesn't work
    expect(i).to.include.something.that.like(
      name: 'Name B'
    )
    done()
  )
)

这不起作用并引发错误消息:

AssertionError: 期望 name: 'Name B', age: 2 喜欢 name: '名字 B'

如何解决这个问题?

【问题讨论】:

【参考方案1】:

加载 chai-like 之前加载 chai-things 以使它们一起工作:

chai.use(require('chai-like'))
chai.use(require('chai-things'))

【讨论】:

【参考方案2】:

使用外部插件并不总是以预期的结果结束。很可能一些命令会发生冲突,因为如果它们一起测试的话,它们并没有经过彻底的测试。

另一种方法是简单地使用一个函数并循环您的数组。这是在浏览器中使用 Mocka 和 Chai 的循环工作示例:

function checkNestedObjects(obj)
    expect(obj).is.an('object')
    //expect(obj).to.have.keys(['a','b','c']); //- Fires Error
    expect(obj).to.have.keys(['a','b']);

    
var initArray=["a":1,"b":1,"a":2,"b":2];
for( var i=0; i < initArray.length; i++)
    checkNestedObjects(initArray[i])
<!DOCTYPE html>
<html>
<head>
  <link href="https://cdnjs.cloudflare.com/ajax/libs/mocha/2.5.3/mocha.min.css" rel="stylesheet"/>
</head>
<body>
  <div id="mocha"></div>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/mocha/2.5.3/mocha.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/chai/3.5.0/chai.min.js"></script>
  
  <script>mocha.setup('bdd')</script>
  <script>
    var expect = chai.expect;
    mocha.run();     
  </script>
</body>
</html>

有时循环中需要异步函数。然后可以使用 Promises 调用循环函数。如何使用 forEach 循环数组以及如何使用 Promise.all 调用“done()”,这里展示的非常好:Node JS Promise.all and forEach

【讨论】:

以上是关于如何将 chai-things 和 chai-like 结合起来?的主要内容,如果未能解决你的问题,请参考以下文章

Vegas7.0如何将插入的图片背景透明和移动?

为啥R语言作图(hist)会将数值1和2频数(频率)合并(如图2),如何拆开(如图1)?

如何将纬度和经度转换为莫顿码(z 阶曲线)

如何将壁纸设置为锁屏或两者(家庭和锁定)?

如何将日期和时间分成两个元素?

业务逻辑和规则——如何将它们与领域模型解耦