我正在 Rails 中测试一个模型,我想断言其中一个关联有 n 个项目。我发现 assert_pattern 匹配器是一个很好的方法:
assert_pattern do
author.books.to_a =>
[Book,
Book,
Book,
Book,
Book]
end
但是,我也发现拥有这样一个大的项目列表可能很难阅读。我尝试过像在 ruby 中通常使用的方式扩展数组:
assert_pattern do
author.books.to_a => [Book]*5
end
但是,在模式匹配器中,这是一个语法错误:
test/models/book_test.rb:39: syntax error, unexpected '*', expecting `end' or dummy end (SyntaxError)
author.books.to_a => [Book]*5
^
有没有一种简洁的方法来制作长度函数的图案?
您可以通过
^(expression)
在模式内使用任意表达式。然而匹配是不同的。
使用
[pattern, ..., *variable]
语法时,例如:
ary => [Foo, Bar, Baz]
Ruby 将单独匹配每个元素,即它检查
ary
是否包含 3 个元素,并且这些元素满足以下条件:
Foo === ary[0]
Bar === ary[1]
Baz === ary[2]
使用
^(expression)
语法时,例如:
ary => ^([Foo, Bar, Baz])
Ruby 会将该表达式的结果视为值,并仅执行一次检查:
[Foo, Bar, Baz] === ary
显然,这是行不通的:
[Book] === [Book.new] #=> false
您可以使用自定义断言来代替模式匹配:
assert do
author.books.size == 5 && author.books.all?(Book)
end