0

これが私のスペックとクラスのコードです:

describe Game do

  before(:each) do
    @game = Factory.build(:game)
  end

  describe '#no_books?' do
    it 'should return true if books attribute is empty' do
      @game.stub(:books).and_return([])
      @game.no_books?.should be_true
    end

    it 'should return false if books attribute is present' do
      @game.no_books?.should be_false
    end
  end

end


class Game

  attr_reader :books

  def initialize
    @books = parse_books
  end

  def no_books?
    @books.empty?
  end

  protected

  def parse_books
    # return books
  end

end

次に、わかりやすい仕様の失敗メッセージが表示されます。

Game#no_books? should return true if books attribute is empty
     Failure/Error: @game.no_books?.should be_true
       expected false to be true

これは、属性ブックが値で初期化される前に、そのメソッドが呼び出されているかのようです。誰かが私にここで何が起こっているのか説明できますか?

4

1 に答える 1

0

実装no_books?は、スタブをバイパスして、チェックでインスタンス変数を直接使用しています。no_books?returnに変更するbooks.empty?と、代わりにスタブが呼び出されます。

本当にインスタンス変数を使い続けたい場合は、次のように設定@gameできます。instance_variable_set

@game.instance_variable_set("@books", [])
于 2012-05-14T02:43:56.930 に答える