gpt4 book ai didi

ruby-on-rails - 具有多个参数的 RSpec 和自定义匹配器

转载 作者:数据小太阳 更新时间:2023-10-29 07:07:11 26 4
gpt4 key购买 nike

我正在尝试使用 RSpec 为我在 RoR 中的测试创建自定义匹配器。

  define :be_accessible do |attributes|
attributes = attributes.is_a?(Array) ? attributes : [attributes]
attributes.each do |attribute|
match do |response|
response.class.accessible_attributes.include?(attribute)
end
description { "#{attribute} should be accessible" }
failure_message_for_should { "#{attribute} should be accessible" }
failure_message_for_should_not { "#{attribute} should not be accessible" }
end
end

我希望能够在我的测试中编写如下内容:

...
should be_accessible(:name, :surname, :description)
...

但是对于上面定义的匹配器,我必须传递一个符号数组而不是用逗号分隔的符号,否则测试只会检查第一个符号。

有什么想法吗?

最佳答案

我是这样实现的:

RSpec::Matchers.define :be_accessible do |*attributes|
match do |response|

description { "#{attributes.inspect} be accessible" }

attributes.each do |attribute|
failure_message_for_should { "#{attribute} should be accessible" }
failure_message_for_should_not { "#{attribute} should not be accessible" }

break false unless response.class.accessible_attributes.include?(attribute)
end
end
end

我反转了 matcheach 循环。我认为这是 Rspec 期望的方式,因为给 match 方法的 block 是由 Rspec 抽象匹配器执行的(我猜)。

通过使用 |*attributes| 定义 block ,它获取参数列表并将其转换为 Array

所以调用 should be_accessible(:name, :surname, :description) 会起作用。

顺便说一下,如果你只想检查属性是否存在,一个简单的

should respond_to(:name, :surname, :description)

同样有效。但它看起来不像质量赋值方面。

关于ruby-on-rails - 具有多个参数的 RSpec 和自定义匹配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16135899/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com