匹配 n 个项目的数组的模式

问题描述 投票:0回答:1

我正在 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
                               ^

有没有一种简洁的方法来制作长度函数的图案?

ruby activerecord minitest
1个回答
0
投票

您可以通过

^(expression)
在模式内使用任意表达式。然而匹配是不同的。

使用

[pattern, ..., *variable]
语法时,例如:

ary => [Foo, Bar, Baz]

Ruby 将单独匹配每个元素,即它检查

ary
是否包含 3 个元素,并且这些元素满足以下条件:

  1. Foo === ary[0]
  2. Bar === ary[1]
  3. 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
© www.soinside.com 2019 - 2024. All rights reserved.