我有一个页面,它要么返回"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