質問

次の状況を仮定しましょう

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

subject { A.new('John') }

それから私はこのようなワンライナーを持ちたいです

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

どういうわけかそれは可能ですか?

役に立ちましたか?

解決 2

はい、それは可能ですが、あなたが使用したい構文(どこでもスペースを使用して)には、 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') }

他のヒント

方法 これは RSPECから削除されました https://gist.github.com/myronmarston/4503509. 。代わりに、この方法で1つのライナーを実行できるはずです。

it { is_expected.to have_attributes(name: 'John') }
person = Person.new('Jim', 32)

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

参照: rspec has-attributes-matcher

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top