gpt4 book ai didi

ruby - 链接 Rspec 自定义匹配器

转载 作者:数据小太阳 更新时间:2023-10-29 08:49:40 24 4
gpt4 key购买 nike

出于测试原因,我最近移动了一些 RSpec 匹配器以使用类形式而不是 DSL。当它们处于这种形式时,有没有一种方法可以轻松获得链接行为。

例如

class BeInZone
def initialize(expected)
@expected = expected
end
def matches?(target)
@target = target
@target.current_zone.eql?(Zone.new(@expected))
end
def failure_message
"expected #{@target.inspect} to be in Zone #{@expected}"
end
def negative_failure_message
"expected #{@target.inspect} not to be in Zone #{@expected}"
end
# chain methods here
end

非常感谢

最佳答案

添加一个名为chain 的新方法,它通常应该返回self。通常,您保存提供的链接状态。然后您更新要使用的 matches? 方法。这种状态也可以用在各种输出消息方法中。

所以对于你的例子:

class BeInZone
# Your code

def matches?(target)
@target = target

matches_zone? && matches_name?
end

def with_name(name)
@target_name = name
self
end

private
def matches_zone?
@target.current_zone.eql?(Zone.new(@expected))
end

def matches_name?
true unless @target_name

@target =~ @target_name
end
end

然后使用它:expect(zoneA_1).to be_in_zone(zoneA).with_name('1')

之所以可行,是因为您正在构建要传递给 shouldexpect(object).to 方法的对象。然后,这些方法对提供的对象调用 matches?

所以它与其他 ruby​​ 代码没有什么不同,比如 puts "hi there".reverse.upcase.gsub('T', '7')。这里的字符串 "hi there" 是您的匹配器,并在其上调用链式方法,将从 gsub 返回的最终对象传递给 puts

内置期望change matcher 是一个很好的例子。

关于ruby - 链接 Rspec 自定义匹配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16334965/

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