【问题标题】:rspec testing a single part of a methodrspec 测试方法的单个部分
【发布时间】:2016-11-17 20:27:49
【问题描述】:

我有这个用于井字游戏的方法:

def start(token)
  if token == "X"
    puts "#{@player1}: Please enter a number for your X to go"
  elsif token == "O"
    puts "#{@player2}: Please enter a number for your O to go"
  end

  player_input = STDIN.gets.chomp

  locate_player_input(token, player_input)
end

我只是想测试看看是否将正确的东西放到终端上。我有这个测试:

describe "#start" do
  context "X player's turns" do
    it "prints proper messege" do
      expect(STDOUT).to receive(:puts).with("Harry: Please enter a number for your X to go")
      game.start("X")
    end
  end
end

但我有一种感觉,game.start("X") 行是无法完成这项工作的。如何编写测试来检查 puts 语句是否正确输出?

【问题讨论】:

  • 一个重构建议:不要使用ifelse,而是使用puts "#{@player2}: Please enter a number for your #{token} to go"
  • 好看。谢谢建议,我开始重构的时候一定会实现的
  • 测试失败了吗?失败信息是什么?
  • 终端只是在等待用户输入一些东西,我假设这是由调用 game.start("X") 后实际方法中的gets语句引起的

标签: ruby testing rspec tdd


【解决方案1】:

我想我明白了。因为我的函数首先是 put-ing 一些东西,然后调用下一个要运行的方法,所以我需要另一个期望语句。我的及格测试是这样的:

describe "#start" do
    context "X player's turns" do
        it "prints proper messege" do
            expect(STDOUT).to receive(:puts).with("Harry: Please enter a number for your X to go")
            expect(game).to receive(:get_input)
            game.start("X")
        end
    end
end

我不确定这是否正确,但测试确实通过了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-12
    • 2019-02-03
    • 2012-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多