在Rspec中组成匹配器

时间:2018-09-24 17:47:03

标签: ruby rspec

Rspec支持组成匹配器。它提供的组成匹配器列表如下:

all(matcher)
include(matcher, matcher)
start_with(matcher)
end_with(matcher)
contain_exactly(matcher, matcher, matcher)
match(matcher)
change {}.from(matcher).to(matcher)
change {}.by(matcher)

所有组成的匹配器都很直观。您可以将匹配器传递给组成匹配器,并且传递的匹配器必须返回true才能使期望为真:

expect(@items).to all(be_visible & be_in_stock)

但是我不确定组成匹配器的start_with和end_with。看这个例子:

fruits = ['apple', 'banana', 'cherry']
expect(fruits).to start_with( start_with('a') )

在此示例中,外部start_和内部start_做什么?

1 个答案:

答案 0 :(得分:1)

在您的示例中,您正在测试fruits的第一个元素以字符a开头。因此,外部starts_with定位到数组的第一个元素,而内部starts_with定位到第一个元素的开始。

您的示例通过了,但是例如失败了:

fruits = ['banana', 'apple', 'cherry']
expect(fruits).to start_with( start_with('a') )

rspec-expectations tests数组中有几个示例,您需要测试第一个元素是否以给定值或字符串开头或结尾。例如:

expect([1.01, "food", 3]).to start_with(a_value_within(0.2).of(1), a_string_matching(/foo/))

expect([3, "food", 1.1]).to end_with(a_value_within(0.2).of(1))

也相关:RSpec starts_with matcher variant using regular expressions