我有这种红宝石方法。我想验证当前属性是否存在且值是否正确。我怎么能用外部方法做到这一点?
def base_commands
{ currency: 'EUR',
card_number: '4200000000000000',
cvv: '123',
amount: '12345' }
end
快速举例:
has_children = !base_commands[:currency].nil?
但我该如何验证这些值?
答案 0 :(得分:1)
请注意,对于h[:x].nil?
,您不一定要测试哈希是否包含元素:x是否为x,因为{x: nil}.nil?
也会评估为 true 。要测试是否存在密钥,您必须使用h.has_key?(:x)
。
假设您有一个哈希h
并想要验证它是否包含方法base_commands
返回的哈希中存在的所有键,您可以执行base_commands.keys.all? {|k| h.has_key?(k)}
之类的操作
要测试属于某个键的值是否符合预期,您必须考虑平等意味着什么。在你的情况下,从方法base_commands
返回的哈希只有字符串作为值,所以在你的情况下,简单的相等很可能是你想要的:h[:currency] == base_commands[:currency]
,或者你想要的任何方式验证它。
在一般情况下,你可以将任意对象作为值,在这里你必须考虑如何看待平等。默认的==
运算符可能使用对象标识,如果这不是您想要的,则必须定义自己的相等方法。
答案 1 :(得分:0)
RSpec有include
matcher:
def base_commands
{ currency: 'EUR', card_number: '4200000000000000', cvv: '123', amount: '12345' }
end
RSpec.describe(base_commands) do
it { is_expected.to include(:currency) } # key only
it { is_expected.to include(currency: 'EUR') } # key and value
it { is_expected.to include(currency: 'EUR', cvv: '123') } # multiple values
end