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

3

はい、可能ですが、使用したい構文 (どこでもスペースを使用) には、すべての引数が 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') }
于 2013-11-08T09:53:09.347 に答える