1

暗黙のサブジェクトが RSpec でどのように機能するかを理解していると思っていましたが、そうではありません。

次の例で、明示的なサブジェクトを含む最初の仕様はパスしますが、暗黙的なサブジェクトを使用する 2 番目の仕様は「未定義のメソッド `matches' for #」で失敗するのはなぜですか?

class Example
  def matches(str) ; true ; end
end

describe Example do
  subject { Example.new }
  specify { subject.matches('bar').should be_true }
  it { matches('bar').should be_true }
end

(rspec 1.3 を使用していますが、2.10.1 でも同じ動作を確認しています。)

4

3 に答える 3

2

基本的な ruby​​ に戻ります。基本的には を呼び出しself.matchesておりself、この場合は RSpec の例です。

この例では、パラメーターを使用して「should」のようなものを呼び出すことができるため、次のようなものを試すことができます。

it { should matches('bar') }

しかし、これは失敗します。matchesself にはまだメソッドがありません!

ただし、この場合、サブジェクトは実際にはmatchesメソッドであり、Example インスタンスではありません。したがって、暗黙の主語を引き続き使用したい場合、テストは次のようになります。

class Example
  def matches(str) ; str == "bar" ; end
end

describe Example do
  describe "#matches" do
    let(:method) { Example.new.method(:matches) }

    context "when passed a valid value" do
      subject { method.call("bar") }
      it { should be_true }
    end

    context "when passed an invalid value" do
      subject { method.call("foo") }
      it { should be_false }
    end
  end
end
于 2012-12-27T19:48:55.967 に答える
0

暗黙の主語のメソッドを呼び出すことはできないと思います。暗黙のサブジェクトとは、サブジェクトを指定する必要がないことを意味しますが、メソッドを呼び出す場合は、サブジェクトを指定する必要があります。

于 2012-12-27T19:42:51.020 に答える