2

我在试图弄清楚我的应用程序目前正在发生的事情时遇到了一些实际问题。我正在努力确保我可以根据用户用于注册的方法(OAuth 与否)在“编辑个人资料”页面上向用户显示不同的内容。

在浏览器中手动测试时,我只需将 OAuth 属性添加到我的用户模型并对其进行测试,就可以正常工作。

但是,在 RSpec 中我无法正确测试。事实上,无论我告诉它在页面上寻找什么元素,它都会声称它们实际上就在那里。

describe "edit user" do

  let(:user) { FactoryGirl.create(:user) }
  before { sign_in user }

  describe "correct edit account options shown to normal users" do
    before do
      visit edit_user_registration_path(:user) 
    end

    it { should have_selector('h2',      text: 'Edit User') }
    it { should have_selector('input',   id:   'user_names')}
    it { should have_selector('input',   id:   'user_email', value: user.email) }
    it { should have_selector('input',   id:   'user_password') }
    it { should have_selector('input',   id:   'user_password_confirmation') }
    it { should have_selector('input',   id:   'user_current_password') }
    it { should have_selector('input',   type: 'submit') }
  end

  describe "correct edit account options shown to oauth users" do

    before do 
      user.update_attributes!(:oauth => true)
      visit edit_user_registration_path(:user)
    end

    it { should have_selector('h2',          text: 'Edit User') }
    it { should have_selector('input',       id:   'user_names')}
    it { should_not have_selector('input',   id:   'user_email') }
    it { should_not have_selector('input',   id:   'users_password') }
    it { should_not have_selector('input',   id:   'users_password_confirmation') }
    it { should_not have_selector('input',   id:   'user_current_password') }
    it { should have_selector('input',       type: 'submit') }
  end
end

我的 RSpec 集成测试的完整代码在这里:https ://gist.github.com/2556055

对此的任何帮助将不胜感激。

4

1 回答 1

2

很幸运能从#rubyonrails 的人那里解决这个问题

原因是 have_selector 不接受多个参数(因此为什么 ID 没有区别)。因此,它们应该被替换为 have_css 方法。

所以正确的实现是:

describe "edit user" do
let(:user) { FactoryGirl.create(:user) }
before { sign_in user }

describe "correct edit account options shown to normal users" do
 before do
    visit edit_user_registration_path(:user) 
 end
 it { should have_selector('h2',      text: 'Edit User') }
 it { should have_css('input#user_name')}
 it { should have_css('input#user_email') }
 it { should have_css('input#user_password') }
 it { should have_css('input#user_password_confirmation') }
 it { should have_css('input#user_current_password') }
 it { should have_selector('input',   type: 'submit') }
end

describe "correct edit account options shown to oauth users" do

before do 
  user.update_attributes!(:oauth => true)
  visit edit_user_registration_path(:user)

end

  it { should have_selector('h2', text: 'Edit User') }
  it { should have_css('input#user_name')}
  it { should_not have_css('input#user_email') }
  it { should_not have_css('input#users_password') }
  it { should_not have_css('input#users_password_confirmation') }
  it { should_not have_css('input#user_current_password') }
  it { should have_selector('input', type: 'submit') }
 end
 end
于 2012-05-01T02:14:42.890 回答