RSpec单行测试对象的属性

Mis*_*rev 2 ruby rspec

我们假设以下情况

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

subject { A.new('John') }
Run Code Online (Sandbox Code Playgroud)

然后我想要像这样的单线

it { should have(:name) eq('John') }
Run Code Online (Sandbox Code Playgroud)

有可能吗?

Bea*_*rtz 5

是的,这是可能的,但是您想要使用的语法(到处使用空格)意味着have(:name)eq('John')都是应用于该方法的参数should。所以你必须预先定义这些,这不能成为你的目标。也就是说,您可以使用rspec 自定义匹配器来实现类似的目标:

require 'rspec/expectations'

RSpec::Matchers.define :have do |meth, expected|
  match do |actual|
    actual.send(meth) == expected
  end
end
Run Code Online (Sandbox Code Playgroud)

这将为您提供以下语法:

it { should have(:name, 'John') }
Run Code Online (Sandbox Code Playgroud)

另外,您可以使用its

its(:name){ should eq('John') }
Run Code Online (Sandbox Code Playgroud)


Mis*_*rev 5

方法将从RSpec https://gist.github.com/myronmarston/4503509中删除.相反,你应该能够这样做一个班轮:

it { is_expected.to have_attributes(name: 'John') }
Run Code Online (Sandbox Code Playgroud)