Ruby 如何检测黄瓜中的rand?
我有一个返回“不匹配”或其中一个模型对象名称的页面。Ruby 如何检测黄瓜中的rand?,ruby,testing,cucumber,Ruby,Testing,Cucumber,我有一个返回“不匹配”或其中一个模型对象名称的页面。 用黄瓜测试的最好方法是什么?我应该在给定的步骤中存根rand,还是应该提供类似页面有a或b的内容?或者我应该在场景大纲参数中提供rand参数,在Given步骤中使用此参数,并使用第二个大纲列检查结果 更新:CookieCookie Monster最佳传统中的控制器示例: cookie\u controller.rb def random_cookie if rand(5) == 0 do cookie = Cookie
用黄瓜测试的最好方法是什么?我应该在
给定的步骤中存根rand,还是应该提供类似页面有a或b的内容?或者我应该在场景大纲参数中提供rand
参数,在Given
步骤中使用此参数,并使用第二个大纲列检查结果
更新:Cookie
Cookie Monster最佳传统中的控制器示例:
cookie\u 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
查找cookie.feature
Scenario: Looking for cookie
When I click "find"
Then I should see "You got 10 free" or "Sorry, no cookies left :'("
如果然后我会看到“你有10个免费的”或“对不起,没有饼干了:”(“
步骤查看?
我试过类似的方法
(page.should have_content "You got 10 free") || (page.should have_content "Sorry, no cookies left :'("
但是它不起作用。您需要设置随机种子,可能需要存储原始种子,以便在测试完成后将其还原
请参阅此处的文档:对于1.9.3或Ruby 2.0.0,请参阅此处的文档:您将需要设置随机种子,可能需要存储原始种子,以便在测试完成后将其还原
请参阅此处的文档:1.9.3或Ruby 2.0.0的文档:不要测试随机行为,因为这违背了正确的软件设计实践。您的测试应该是确定性的
控制这种情况的一种方法是定义一个可以根据需要替换或模拟的模块或类:
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\u cookie?
方法来模拟各种条件
当然,您需要在某种类型的单元测试中测试free_cookies
方法本身。在这种情况下,您可能需要运行大量测试,以确保它发出的cookie数量大致正确。不要测试随机行为,因为这违反了正确的软件设计实践。您的测试应该要有确定性
控制这种情况的一种方法是定义一个可以根据需要替换或模拟的模块或类:
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\u cookie?
方法来模拟各种条件
当然,您需要在某种类型的单元测试中测试free_cookies
方法本身。在这种情况下,您可能需要运行大量测试,以确保它发出的cookie数量大致正确。测试的一个属性是它们应该是可重复的:它们应该产生相同的结果测试不应该依赖于不可控的参数(如外部资源或随机源)
我的观点是,你需要两个测试,一个是检查“你有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
您需要找到哪些种子会给您一个或另一个结果,但一旦找到它们,它们将永远工作。测试的一个特性是它们应该是可重复的:它们应该每次都产生相同的结果。测试不应该依赖于不可控的参数(如外部资源或随机源)
我的观点是,你需要两个测试,一个是检查“你有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
你需要找到哪些种子会给你一个或另一个结果,但一旦你找到它们,它们将永远有效。实际上,一旦你在测试中将srand
设置为一个固定的数字,错误就会告诉你结果的顺序,所以你基本上可以要求测试给你这些信息。实际上,一旦你设置了srand
对于测试中的一个固定数字,错误应该告诉您结果的顺序,因此您基本上可以要求测试向您提供该信息。