1

次の 2 つの自明なモデルを考えてみましょう。

class Iq

  def score
    #Some Irrelevant Code
  end

end

class Person

  def iq_score
    Iq.new(self).score   #error here
  end

end

そして、次の Rspec テスト:

describe "#iq_score" do

  let(:person) { Person.new }

  it "creates an instance of Iq with the person" do
    Iq.should_receive(:new).with(person)
    Iq.any_instance.stub(:score).and_return(100.0)
    person.iq_score
  end

end

このテスト (または類似のテスト) を実行すると、スタブが機能していないように見えます。

Failure/Error: person.iq_score
  NoMethodError:
    undefined method `iq_score' for nil:NilClass

ご想像のとおり、失敗は上記の「ここでエラー」とマークされた行にあります。should_receive行をコメント アウトすると、このエラーは表示されなくなります。どうしたの?

4

2 に答える 2

8

RSpec にはスタバー機能が拡張されているため、次の方法が正しいです。

Iq.should_receive(:new).with(person).and_call_original

(1)期待値をチェックします(2)nilを返すだけでなく、制御を元の関数に返します。

于 2013-03-25T09:50:12.803 に答える
4

イニシャライザをスタブしています:

Iq.should_receive(:new).with(person)

nil を返すので、Iq.new は nil です。修正するには、次のようにします。

Iq.should_receive(:new).with(person).and_return(mock('iq', :iq_score => 34))
person.iq_score.should == 34 // assert it is really the mock you get
于 2012-07-04T08:00:11.307 に答える