学习 NightWatch - 断言
断言
使用时,若断言失败,则停止运行测试,否则继续
// ...
// .logo 会出现
// 否则终止运行
browser.assert.visible('.logo')
// ...
来自 Node.js 的断言模块也可以使用
.not
用于取反
// ...
// .logo 不会出现
// 否则终止运行
browser.assert.not.visible('.logo')
// ...
自动重试
默认情况下,NightWatch 会自动重试失败的断言,可在配置文件中配置超时时间(单位:ms)
// nightwatch.conf.js
{
// ...
retryAssertionTimeout: 5000
// ...
}
BDD式断言
提高可读性 只是连接词,无具体作用
to
到be
是been
曾经is
是that
那个which
哪一个and
和has
有have
有with
具有at
在of
属于same
相同的but
但是does
做still
还also
而且
方法
测试值
.ok
断言目标为真值.true
断言目标为 true,不做类型转换,即 true === true.false
断言目标为 false,不做类型转换,即 false === false.null
断言目标为 null,不做类型转换,即 null === null.undefined
断言目标为 undefined,不做类型转换,即 undefined === undefined.NaN
断言目标为 NaN.exist
断言目标存在,即非 null 也非 undefined.empty
断言目标长度为 0,对于数组、字符串,检查 length 属性,对于对象,检查可枚举属性数量.arguments
断言对象是一个参数对象 arguments.instanceof(Constructor)
断言目标是 构造函数Constructor 的实例.a(String) / .an(String)
是否是某个类型 可作为语言链亦可作为断言使用
判断
.equal(value)
断言 目标 === value.eql(value)
断言 目标深等于 value 相等于 deep.equal(value) 缩写.above(Number)
断言目标大于(超过)Number.least(Number)
断言目标大于或等于 Number.below(Number)
断言目标小于 Number.most(Number)
断言目标不小于或等于 Number.within(Start, End)
断言目标在 Start - End 区间内以上 皆可在 length 后跟随,相比直接提供长度好处为提供了更详细的错误信息
closeTo(Number1, Number2)
期望目标为 Number1, 误差在 Number2 上下.not
对之后的断言取反
对象
.extendsible
断言目标是可拓展(可添加新属性).sealed
断言目标是封闭的(无法添加新属性和删除属性,但可被修改).frozen
断言目标是冻结的(无法增删改属性).keys(key1[, key2, ...])
- key: String | Array | Object 属性名
断言目标包含传入的属性名,与 any, all, contains,或 have 前缀配合使用时会影响结果
与 any 结合时,无论是 have 或 contains 前缀,必须存在任意传入属性才能通过,any 或 all 至少使用一个,否则默认 all
结合 all 和 contains 时,必须包含全部传入属性,但是可以拥有其他未传入属性
结合 all 和 have 时,必须且只能包含传入属性
.include(Object | String | Number)
/ contains(Object | String | Number) 判断数组,字符串是否包含某值可作为属性类断言前缀语言链,当作为语言链使用时,常用于 keys() 断言之前
ownProperty(key)
断言目标具有名为 key 的自有属性ownPropertyDescription(key[, descriptor])
断言目标自有属性 key 存在描述符对象如果给定描述符对象 descriptor,则必须匹配
.any
&.all
- .any 在 keys 断言之前使用 any 标记 (与 all 相反) 任意一个
- .all 在 keys 断言之前使用 all 标记 (与 any 相反) 全部所有
函数
.change(Object, String)
断言目标方法会更改Object[String].increase(Object, String)
断言目标方法会增加Object[String].decrease(Object, String)
断言目标方法会删除Object[String].throw(ErrorConstructor | String | RegExp)
断言目标函数会抛出一个指定错误或错误类型(使用 instanceOf 计算)也可使用正则表达式或字符串检查错误信息
数组
.members(Array)
断言目标是 Array 的超集,或目标有 Array 所有 === 的成员,若设置 deep 标记,则成员进行深度比较(include / contains 只能接受单个值,可判断数组字符串,members 接受数组,只判断数组)
.oneOf(Array)
断言目标出现在 Array 的某个顶层位置(直接子元素,严格相等)
字符串
.match(RegExp)
断言目标匹配 RegExp 正则表达式.string(String)
断言目标字符串包含 String
.deep
设置 deep 标记,然后使用 equal 或 peoperty 断言,该标记可让之后的断言不比较对象本身而是递归比较对象键值对
deep.property 中特殊符号通过 \\
转义,第一个 \ 转义第二个 \, 第二个 \ 在 property 中进行转义
expect(foo).to.deep.equal({ bar: 'baz'})
expect({ foo: { bar: { baz: 'quux'}}})
.to.have.deep.property('foo.bar.baz', 'quux')
.property(key, [value])
断言目标是否具有某个为 key 的属性
如果提供了 value 则值必须严格等于 value,若设置了 deep,则可使用 . 或 [] 指向对象和数组的深层属性
同时,property 会将断言主语由原先对象变更为当前属性值,使其后可以针对此属性值测试
只有使用 deep 时,property 中的 . [] 才必须使用 \\
转义
.length
设置 .have.length 标记作为 length 比较属性值的前缀
.lengthOf(Number)
断言目标的 length 为 Number
.respondTo(String)
断言目标类或对象会响应一个方法(存在此方法)
.itself
设置 itself 标记,然后使用 .respondTo 检查是否为挂载于构造函数本身的方法
.satisfy(value:any => Boolean)
传入 value 代表目标值,返回一个布尔值
count
计数
expect.elements(Elements).count.to.equal(5);