0

我有一个返回“不匹配”的页面。或模型对象名称之一。
用 Cucumber 测试它的最佳方法是什么?我应该Given逐步存根 rand 还是应该提供类似的东西page has either a or b?或者也许我应该rand在场景大纲参数中提供参数,在Given步骤中使用此参数并使用第二个大纲列来检查结果?

更新: cookies Cookie Monster 最佳传统中的控制器示例:

cookie_controller.rb

  def random_cookie
    if rand(5) == 0 do
      cookie = Cookie.offset(rand(Cookie.count)).first
      response =  "You got 10 free #{cookie.type} cookies for your purchase!"
    else
      response = "Sorry, no cookies left :'("
    end
    respond_to do |format|
        format.json { render json: { response: response } }
  end

find_cookie.feature

Scenario: Looking for cookie
    When I click "find"
    Then I should see "You got 10 free" or "Sorry, no cookies left :'("

Then I should see "You got 10 free" or "Sorry, no cookies left :'("步骤看起来如何?我试过类似的东西

  (page.should have_content "You got 10 free") || (page.should have_content "Sorry, no cookies left :'(" 

但它没有用。

4

3 回答 3

3

测试的特性之一是它们应该是可重复的:它们应该每次都产生相同的结果。测试不应依赖于不可控的参数(如外部资源或随机源)。

我的观点是,您需要进行两项测试,一项检查“您有 10 个免费”,另一项检查“抱歉,没有 cookies”。

在 的文档中rand,您可以找到以下代码段:“<code>Kernel::srand 可用于确保程序的不同运行之间随机数的可重复序列。”,因此,如果您使用设置步骤编写场景种子到某个数字,你知道结果(总是)在一个结果或另一个你将有你的测试。

Scenario: Looking for cookie and finding it
  When I seed with X
  And click "find"
  Then I should see "You got 10 free"
Scenario: Looking for cookie and not finding it
  When I seed with Y
  And click "find"
  Then I should see "Sorry, no cookies left :'("


When /^I seed with (\d+)$/ do |seed|
  srand(seed.to_i)
end

您将需要找到哪些种子会给您带来一种或另一种结果,但是一旦找到它们,它们就会永远起作用。

于 2013-06-25T20:59:40.340 回答
1

不要测试随机行为,因为这违背了正确的软件设计实践。您的测试应该是确定性的。

控制这一点的一种方法是定义一个可以根据需要替换或模拟的模块或类:

def random_cookie
  if CookieDealer.free_cookie?
    # ...
  end
end

该方法如下所示:

require 'securerandom'

module CookieDealer
  def self.free_cookie?
    SecureRandom.random_number(5) == 0
  end
end

然后,您可以模拟该free_cookie?方法以模拟各种条件。

当然,您会希望free_cookies在某种单元测试中测试方法本身。在这种情况下,您可能需要运行大量测试以确保它分发的 cookie 数量大致正确。

于 2013-06-25T20:57:04.427 回答
0

您将需要设置随机种子,也许存储原始种子以在测试完成后恢复它。

请参阅此处的文档: http : //ruby-doc.org/core-1.9.3/Kernel.html#method-i-srand 1.9.3 或 Ruby 2.0.0 的文档:http://ruby-doc。 org/core-2.0/Kernel.html#method-i-srand

于 2013-06-25T20:56:54.800 回答