rspec测试只运行整个程序

时间:2016-07-12 02:54:27

标签: ruby-on-rails ruby rspec

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

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

2 个答案:

答案 0 :(得分: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类放在game.rb中并让tictactoe.rb执行require "game",并使用测试Game类的RSpec代码执行相同操作。

随着程序变大,后一种方法更易于维护。如果你看一下像Bundler这样的大型宝石,你会发现"程序"文件,bundle只有几行代码 - 所有它都是require其他能够完成实际工作的代码。

但是,如果您的计划规模很小,并且您预计短期内它会增长很多,那么前一种方法也很好。

答案 1 :(得分:0)

试试这个。首先,$noofsongs = "select * from songs_list"; $query8 = mysqli_query($con, $noofsongs); $noio = mysqli_num_rows($query8); $flag = 0; if(isset($_POST['deletethis'])){ for($j=0; $j<=$noio ;$j++){ if (isset($_POST['<?php echo"cb".$j;?>'])){ $deletesongsquery = "DELETE FROM `songs_list` WHERE `sno.` = $j" ; $query4 = mysqli_query($con, $deletesongsquery); $flag = $flag + 1; } } echo $flag; }位于文件顶部。

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 NOT rspec

运行文件

所以

ruby