2016-07-12 27 views
0

我只有几天学习rspec,我试图在包含类的程序中编写我的第一个测试。我知道这个测试是错误的,但我不知道如何解决它,因为我没有失败。相反,它只是开始贯穿我的程序(一个简单的tic tac toe游戏)。为了简洁,我省略了tic tac toe游戏的代码。任何指导将不胜感激。谢谢!rspec测试只是运行整个程序

require "tictactoe" 

describe Game do 
    describe "#players" do 
    it "displays player names" do 
     player1 = "Harry" 
     expect(Game.new("Harry", "Nick").players).to eq(player1) 
    end 
    end 
end 
+0

如果你这样做,例如'ruby tictactoe.rb'它可以运行你的整个程序吗?如果是这样,那么'require“tictactoe”'也会运行你的整个程序。 –

+0

是运行ruby tictactoe.rb将运行我的程序。我之所以这样做是因为对于我写的所有其他实践规范,我已经将该文件包含在我的ruby代码中。我不应该这样做吗? –

回答

2

运行文件正如我们在上面的评论发现,问题是,tictactoe.rb具有运行你的整个代码程序,所以require "tictactoe"也运行你的整个程序。

有两种解决方案。

第一种方法是将tictactoe.rb更改为只执行从命令行执行脚本时运行整个程序的代码,而不执行其他脚本中的require d。这是在Ruby中一个常见的成语:

# declare your classes up here 
class Game 
    # ... 
end 

# etc... 

# down here run the program only if this 
# script is run from the command line 
if __FILE__ == $0 
    game = Game.new 
    # ...and so on... 
end 

现在你可以require "tictactoe"在测试中,知道在if块中的代码不会被执行。

第二种解决方案是将您的类声明移动到其他文件中,例如,把游戏类放在game.rb之内,并且有tictactoe.rbrequire "game",并且测试Game类的RSpec代码也是这样做的。

随着程序变大,后一种方法更易于维护。如果你看一下像Bundler这样的大型宝石,你会发现“程序”文件bundle只有几行代码 - 它所做的其他代码是require其他代码,它们确实可行。

但是,如果你的程序很小,并且你不希望它在短期内增长很多,那么前一种方法也很好。

+0

我没有足够的积分来响应您的回复,但它帮助我迈向正确的轨道。非常感谢您向我展示这个技巧! –

0

试试这个。首先,require rspec位于文件顶部。

require "tictactoe" 
require "rspec" 

RSpec.describe Game do 
    describe "#players" do 
    it "displays player names" do 
     player1 = "Harry" 
     expect(Game.new("Harry", "Nick").players).to eq(player1) 
    end 
    end 
end 

然后确保你rspecruby

所以

rspec foo.rb 
+0

这没有奏效。我有一种感觉,它与预期声明中的Game.new调用有关,但我不知道如何去做,因为当调用Game.new时,玩家名称会被初始化为实例变量。从那里我希望能够调用#players方法,然后确保将玩家的姓名放在屏幕上。 –

+0

你得到的错误是什么? – nikkypx