如何用黄瓜中的`rand`测试方法?

时间:2013-06-25 20:42:00

标签: ruby testing cucumber

我有一个页面要么返回“不匹配”。或其中一个模型对象名称 用黄瓜测试它的最佳方法是什么?我应该在Given步骤中保留rand还是应该提供page has either a or b之类的内容?或者我可以在scenarion outline参数中提供rand参数,在Given步骤中使用此参数并使用第二个大纲列检查结果?

更新: cookies Cookie怪物最佳传统的控制器示例:

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

但它不起作用。

3 个答案:

答案 0 :(得分:3)

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

我的观点是你需要进行两次测试,一次检查“你有10个免费”,另一个检查“抱歉,没有留下任何cookie”。

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

你需要找到哪个种子给你一个结果或另一个结果,但一旦找到它们,它们将永远有效。

答案 1 :(得分: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。

答案 2 :(得分:0)

您将需要设置随机种子,可能存储原始内容以在测试完成后将其恢复。

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