2016-07-14 3 views
1

Я очень застреваю, когда дело доходит до написания теста, чтобы проверить, равна ли переменная экземпляра определенному значению, тогда он должен вызывать определенный метод и что если он меньше этого значения , то это не должно. У меня есть переменная экземпляра, @counter, который инициализируется в 0, и эти методы:rspec проверить, если один метод вызывает другой метод

def increment_counter 
    @counter += 1 

    if @counter == 9 
     tie_game? 
    end 
end 

def tie_game? 
    puts "The game was a tie. Nicely played #{@player1} & #{@player2}!" 
    play_again 
end 

Я хочу написать тест, чтобы проверить, что при @counter равен 9, что tie_game? и что, когда он меньше 9, он не вызывается.

Это то, что я мог придумать, но это не так:

describe "increment_counter" do 
    context "counter equals 9" do 
     it "calls tie_game?" do 
      game.instance_variable_set(:@counter, 9) 
      expect(increment_counter).to receive(:tie_game?) 

     end 
    end 
end 

ответ

1

Вы должны проверить, был ли tie_game? призвал game инстанции, а не increment_counter. С кодом, который вы дали, один из способов сделать это было бы

describe "increment_counter" do 
    context 'counter equals 9' do 
    let(:game) { Game.new } 
    it 'calls tie_game?' do 
     game.instance_variable_set(:@counter, 8) 
     game.increment_counter 
     expect(game).to receive(:tie_game?) 
    end 

    it 'does not call tie_game?' do 
     game.increment_counter 
     expect(game).not_to receive(:tie_game?) 
    end 
end 

конец

Я предполагаю, что ваше имя класса Game. Поскольку для ваших примеров требуется экземпляр game, мы можем высушить его и использовать let, чтобы определить экземпляр игры. Обратите внимание, что let - lazily evaluated. Это означает, что он выполняется только тогда, когда он ссылается в примере блока. Если вы установите для переменной экземпляра значение 0 в методе initialize, тесты будут работать нормально.

Обратите внимание, что я устанавливаю @counter до 8, а затем я запуск increment_counter метода тестирования вызывает ли tie_game?

PS: Если tie_game будет логический метод? play_again возвращает boolean.I не уверен, должен ли он быть логическим методом.

+0

спасибо за ваш совет. Кажется, что это работает, но когда я запускаю его в терминале, прежде чем он расскажет мне о любых сбоях, он запускает метод play_again. Знаете ли вы, как я должен идти, чтобы убедиться, что это не так? –