【发布时间】:2014-01-04 22:02:33
【问题描述】:
我正在使用 rspec、capybara 和 Selenium 来测试我的整个应用程序堆栈。我已经关闭了事务性装置,并且只有在整个套件运行后才使用数据库清理器来清理我的数据库。这些允许我使用之前测试中创建的对象来测试事物。
无论如何,假设我想创建用户 a999(通过表单,因此本身就是一个测试),然后继续测试将他注销并重新登录。
def sign_up(first_name, last_name, profile_name, email, password)
visit "/"
click_link "Register"
fill_in('First name', with: first_name)
fill_in('Last name', with: last_name)
fill_in('Profile name', with: profile_name)
fill_in('Email', with: email)
fill_in('Password', with: password)
fill_in('Password confirmation', with: password)
click_button 'Sign up'
end
feature "user a999 sign up", js: true do
before(:each){
sign_up( @a999.first_name, @a999.last_name, @a999.profile_name, @a999.email, @a999.password )
}
scenario "welcome message" do
expect(page).to have_content ("Welcome," + @a999.first_name)
end
scenario "can log out" do
end
scenario "can log in" do
end
end
上面的代码几乎可以工作。这是运行时发生的情况:
before 块在“欢迎消息”预期之前注册用户(感谢 Selenium,我看到它在 Firefox 中实际发生),然后欢迎消息在重定向后出现,因此“欢迎消息”规范通过。
但是,因为我将前块设置为“每个”,所以前块又运行了两次,这意味着我现在在数据库中有三个 a999 用户。
当然,将 before 块设置为 (:all) 应该可以解决这个问题。用户注册了一个,我们从那里开始,签入和签出完全相同的用户。这是一个测试整个堆栈记住的功能测试,所以我想正确地做到这一点,模拟真实用户将如何使用我的应用程序。
def sign_up(first_name, last_name, profile_name, email, password)
visit "/"
click_link "Register"
fill_in('First name', with: first_name)
fill_in('Last name', with: last_name)
fill_in('Profile name', with: profile_name)
fill_in('Email', with: email)
fill_in('Password', with: password)
fill_in('Password confirmation', with: password)
click_button 'Sign up'
end
feature "user a999 sign up", js: true do
before(:all){
sign_up( @a999.first_name, @a999.last_name, @a999.profile_name, @a999.email, @a999.password )
}
scenario "welcome message" do
expect(page).to have_content ("Welcome," + @a999.first_name)
end
scenario "can log out" do
end
scenario "can log in" do
end
end
但是对于这段代码,什么都没有发生。说真的,什么都没有。 Selenium 根本不遵循 before 块中的代码! Firefox 甚至没有启动。
这是为什么?我的意思是,这至少应该有效。
before(:each) = 在我眼前注册用户
之前(:all) = 完全死了
【问题讨论】:
标签: ruby-on-rails selenium rspec