我正在试图弄清楚如何编写测试以检查玩家是否赢得了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