间接调用的方法内部的黄瓜和变量

时间:2012-05-10 12:46:18

标签: ruby tdd cucumber

请注意:我是TDD&黄瓜,所以答案可能很容易。

我正在为测试创建一个基本的图像编辑器(图像只是一系列字母)。 我写了一篇黄瓜故事:

Scenario Outline: edit commands
    Given I start the editor
    And a 3 x 3 image is created
    When I type the command <command>
    Then the image should look like <image> 

步骤

Scenarios: colour single pixel
    | command   | image     |
    | L 1 2 C   | OOOCOOOOO |

总是失败,返回

  expected: "OOOCOOOOO"
       got: " OOOOOOOO" (using ==) (RSpec::Expectations::ExpectationNotMetError)

这是步骤代码:

When /^I type the command (.*)$/ do |command|
  @editor.exec_cmd(command).should be
end

程序中的exec_cmd函数识别该命令并启动相应的操作。在这种情况下,它将启动以下

def colorize_pixel(x, y, color)
  if !@image.nil?
    x = x.to_i 
    y = y.to_i
    pos = (y - 1) * @image[:columns] + x
    @image[:content].insert(pos, color).slice!(pos - 1)
  else
    @messenger.puts "There's no image. Create one first!"
  end
end

但是,除非我在程序本身的函数中硬编码两个局部变量(pos和color)的值,否则总会失败。

为什么呢?看起来我在程序本身做错了:函数执行它应该做的事情,这两个变量只在本地有用。所以我认为这是我使用黄瓜的问题。我该如何正确测试?

--- ---编辑

def exec_cmd(cmd = nil)
  if !cmd.nil? 
    case cmd.split.first
      when "I" then create_image(cmd[1], cmd[2])
      when "S" then show_image
      when "C" then clear_table
      when "L" then colorize_pixel(cmd[1], cmd[2], cmd[3])
    else
      @messenger.puts "Incorrect command. " + "Commands available: I C L V H F S X."
    end
  else 
    @messenger.puts "Please enter a command."
  end
end

2 个答案:

答案 0 :(得分:1)

When /^I type the command (.*)$/ do |command|
  @output = @editor.exec_cmd(command)
end
Then /^the image should look like (.)*$/ do |expected_image|
  @output.should == expected_image 
end

希望这可以帮助你。

答案 1 :(得分:0)

这不是黄瓜问题。

问题是,在exec_cmd中,split仅在“case”子句中调用,而不是在“when”s中调用。这意味着,由于命令的格式是“a 1 2 b”,“when”中的cmd [1]将调用字符串的第二个字符,空格,而不是数组的第二个值,其他函数将转换为to_i,返回0。

我改变了这样的exec_cmd:

def exec_cmd(cmd = nil)
  if !cmd.nil?
    cmd = cmd.split
    case cmd.first
    when "I" then create_image(cmd[1], cmd[2])
    [...]
end

解决了这个问题。