以下の状況を想定してみましょう
class A
attr_accessor :name
def initialize(name)
@name = name
end
end
subject { A.new('John') }
次に、このようなワンライナーが必要です
it { should have(:name) eq('John') }
なんとなく可能ですか?
はい、可能ですが、使用したい構文 (どこでもスペースを使用) には、すべての引数が method に適用されるという意味がhave(:name)
あります。したがって、それらを事前に定義する必要がありますが、これは目標にはなりません。そうは言っても、rspec カスタム マッチャーを使用して同様の目標を達成できます。eq('John')
should
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') }