【问题标题】:"background(:all)" block doesn't work in rpsec feature spec“背景(:所有)”块在 rpsec 功能规范中不起作用
【发布时间】: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


    【解决方案1】:

    我无法解释为什么什么都没有出现,但根据大量帖子*,您不能合理地将 before(:all) 与水豚一起使用,因为它会重置每个示例之间的会话。

    *相关帖子:

    【讨论】:

    • 嗯,好吧。有道理,意味着每一个期望都会相互独立,但同时看起来真的很浪费!
    • 嗨彼得,很抱歉,我会看看我的问题。
    • @Starkers - 太好了。我想你会传播很多善意。 :-) 顺便说一句,我删除了我的 cmets。
    猜你喜欢
    • 2013-01-28
    • 1970-01-01
    • 1970-01-01
    • 2017-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多