如何在黄瓜中用rand检验方法



我有一个页面,它要么返回"No match.",要么返回一个模型对象名称
用黄瓜测试它的最佳方法是什么?我应该在Given步骤中插入rand,还是应该提供类似page has either a or b的东西?或者我应该在场景大纲参数中提供rand参数,在Given步骤中使用此参数,并使用第二个大纲列检查结果?

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

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 :'(" 

但它没有起作用。

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

我的观点是,你需要两个测试,一个测试"你有10个免费",另一个测试检查"对不起,没有饼干了"。

rand的文档中,您可以找到以下片段:"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

你需要找到哪些种子会给你带来这样或那样的结果,但一旦你找到它们,它们就会永远发挥作用。

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

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

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。

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

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

最新更新