1

请注意:我是 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
4

2 回答 2

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

希望这可以帮助你。

于 2012-05-10T14:25:02.027 回答
0

不是黄瓜的问题。

问题是,在 exec_cmd 中,split 仅在“case”子句中调用,而不是在“when”中。这意味着,由于命令的格式是“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

这解决了这个问题。

于 2012-05-14T08:11:59.370 回答