rspec instance_variable_set其中实例变量是一个数组

时间:2016-07-15 01:16:25

标签: ruby-on-rails ruby rspec bdd

我正在试图弄清楚如何编写测试以检查玩家是否赢得了tic tac toe。我有一个实例变量@wins,在这个方法中初始化:

class Game
attr_accessor :wins

def initialize(player1, player2)
   @player1 = player1
   @player2 = player2
   @rows = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

   @wins = [1, 2, 3], [4, 5, 6], [7, 8, 9], 
        [1, 4, 7], [2, 5, 8], [3, 6, 9],
        [1, 5, 9], [3, 5, 7]

    @selected_numbers = []
    @counter = 0
end

我还有一种方法来检查玩家是否赢了:

def win?(token)
    @wins.each do |row|
        return true if row.all? { |input| input == "#{token}"}
    end

    false
end

我试图以一系列不同的方式进行rspec测试,但这就是我现在所拥有的(我知道这是错误的):

describe "win?" do
    context "top row win" do
        it "returns true" do
            allow(game).to receive(:wins).and_return(["X", "X", "X"])

            expect(game.win?("X")).to eq(true)
        end
    end
end

我的问题是:我如何改进此测试以检查当顶行是同一个字母时玩家是否获胜。而且,如果它是一个数组,你怎么能在rspec中设置一个实例变量?

编辑:我试过期待游戏(......)而不是允许,它也不起作用。我得到一个错误的期望(game.win?(“X”))。到eq(true)说预期是真的但是它是假的

编辑2:我能够让测试工作。我的问题是我的instance_variable_set中没有两组数组括号。更新后的rspec测试如下。

describe "win?" do
    context "top row win" do
        it "returns true" do
            game.instance_variable_set(:@wins, [["X", "X", "X"], [4, 5, 6], [7, 8, 9], 
        [1, 4, 7], [2, 5, 8], [3, 6, 9],
        [1, 5, 9], [3, 5, 7]])
            expect(game.win?("X")).to eq(true)
        end
    end
end

0 个答案:

没有答案