【问题标题】:DRYing my RSPEC Test for a Rook Chess Piece: Rook.valid_move?为 Rook 棋子干燥我的 RSPEC 测试:Rook.valid_move?
【发布时间】:2017-05-09 01:10:41
【问题描述】:

我正在寻找干掉我的代码,以便测试从棋盘第一行垂直移动的 Rook (x_position = 0) 的有效移动。

这是我目前面临的挑战。以下代码块从 x_position(0) 开始遍历板上的所有方格,并迭代 y_position(0..7),最后将每个 x_poisition 迭代到 7。

我当前的规范测试代码:

require 'rails_helper'

RSpec.describe Rook, type: :model do
  describe "#valid_move?" do
    it "returns true if move is valid vertically" do
      game = FactoryGirl.create(:game)
      rook = FactoryGirl.create(:rook, x_position: 0, y_position: 0, game: game)
      (0..7).each {|i| (0..7).each {|j| expect(rook.valid_move?(i,j)).to eq(true)}}
    end

我对这段代码的追求是,而不是 FactoryGirl 在 (0,0) 处启动车,而是使用循环让 FatroyGirl 在 (0,0) 处启动车并迭代 y_position(1.. 7) 然后将 x_position 加 1 并再次迭代 y_position(1..7) 直到 (7,7) 被测试。

【问题讨论】:

    标签: ruby-on-rails ruby rspec factory-bot rspec-rails


    【解决方案1】:

    我绝不是专家,但看起来您正在位置 (0,0) 处创建一个片段

    然后您测试是否从 (0,0) 移动到板上的每个位置并断言所有位置都应该有效。

    我建议将循环展开为开始/结束形式并放入一些打印语句,以便您了解发生了什么。

    我想你想要更多:

    (0..7).each {|i| rook.move_to(?,?) ; (i..7).each {|j| expect(rook.valid_move?(i,j)).to eq(true)}}
    

    所以基本上你想分两个阶段做事。首先将车设置到一个位置,然后测试它是否可以移动到其他有效位置。并且可能还测试移动到无效位置的尝试。

    【讨论】:

    • 谢谢布伦登!这非常有帮助。这似乎是一个愚蠢的时刻,但我没有意识到我应该考虑使用动作(方法)在我的测试中移动这块。现在更有意义了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-28
    • 1970-01-01
    • 2014-05-08
    相关资源
    最近更新 更多