8

让我们假设以下情况

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

subject { A.new('John') }

那么我想要一些像这样的单线

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

有可能吗?

4

3 回答 3

11

方法已从 RSpec https://gist.github.com/myronmarston/4503509删除。相反,您应该能够以这种方式做一个班轮:

it { is_expected.to have_attributes(name: 'John') }
于 2017-05-04T17:29:59.933 回答
3

是的,这是可能的,但是您要使用的语法(在任何地方都使用空格)暗示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

这为您提供了以下语法:

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

此外,您可以使用its

its(:name){ should eq('John') }
于 2013-11-08T09:53:09.347 回答
3
person = Person.new('Jim', 32)

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

参考:rspec 有属性匹配器

于 2018-11-15T18:02:12.940 回答