ruby 用于测试对象属性的RSpec一行程序

eyh26e7m  于 2023-11-18  发布在  Ruby
关注(0)|答案(3)|浏览(114)

让我们假设以下情况

class A
    attr_accessor :name
    def initialize(name)
        @name = name
    end
end

subject { A.new('John') }

字符串
那么我想要一些像这样的俏皮话

it { should have(:name) eq('John') }


有可能吗?

6psbrbz9

6psbrbz91#

方法its已从RSpec https://gist.github.com/myronmarston/4503509中删除。相反,您应该能够以这种方式执行一行代码:

it { is_expected.to have_attributes(name: 'John') }

字符串

xzabzqsa

xzabzqsa2#

是的,这是可能的,但是你想要使用的语法(在所有地方使用空格)有一个隐含的含义,即have(:name)eq('John')都是应用于方法should的参数。所以你必须将这些参数转换为参数,这不是你的目标。也就是说,你可以使用rspec custom matchers来实现类似的目标:

require 'rspec/expectations'

RSpec::Matchers.define :have do |meth, expected|
  match do |actual|
    actual.send(meth) == expected
  end
end

字符串
这将为您提供以下语法:

it { should have(:name, 'John') }


也可以使用its

its(:name){ should eq('John') }

w8f9ii69

w8f9ii693#

person = Person.new('Jim', 32)

expect(person).to have_attributes(name: 'Jim', age: 32)

字符串
参考:rspec have-attributes-matcher

相关问题