我正在使用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
上面的代码几乎可以使用。这就是它运行时会发生的事情:
之前的块在“欢迎消息”期望之前注册用户(由于Selenium,我看到它在Firefox中实际发生),然后在重定向之后出现欢迎消息,因此“欢迎消息”规范通过。
但是,因为我将before块设置为'each',所以before block再运行两次,这意味着我现在在数据库中有三个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根本不遵循前一块中的代码! Firefox甚至没有启动。
这是为什么?我的意思是,这至少应该起作用。
之前(:每个)=在我眼前用户注册
之前(:all)=完全死亡
答案 0 :(得分:1)
我无法解释为什么什么都没有出现,但基于很多帖子*,你不能合理地使用before(:all)
和水豚,因为它会重置每个例子之间的会话。
*相关帖子: