为什么我的测试失败了错误的参数(预期的URI对象或URI字符串)错误?

时间:2015-08-17 11:45:52

标签: ruby-on-rails ruby-on-rails-4 rspec factory-bot

我有一个场景,我必须根据{的值将 角色 分配给 用户 {1}}(即,他们注册的网页的 网址 )。我通过以下代码实现了它

request.referrer

我将其作为#application_controller.rb private def store_referrer_url session[:referrer] ||= URI(request.referer).path if ((self.controller_name == 'registrations' || self.controller_name == 'users/omniauth_callbacks')) end 的值传递给下面的

形式
hidden_field

一切正常,但我的测试失败并出现以下错误

<%= f.hidden_field :referrer_url, :value => session[:referrer] %>

以下是我的测试代码

2) Sign in user can sign up
     Failure/Error: sign_up(user.first_name, user.last_name, user.email, user.encrypted_password, user.encrypted_password)
     ArgumentError: bad argument (expected URI object or URI string
     ./app/controllers/application_controller.rb:100:in `store_referrer_url'

更新

我刚注意到#/spec/features/users/user_sign_up_spec.rb include Warden::Test::Helpers Warden.test_mode! feature 'Sign up', :devise do scenario 'user can sign up' do user = FactoryGirl.create(:user) sign_up(user.first_name, user.last_name, user.email, user.encrypted_password, user.encrypted_password) end end #/spec/features/support/helpers/session_helpers.rb module Features module SessionHelpers def sign_up(firstname, lastname, email, password, confirmation) visit new_user_registration_path fill_in 'first_name', with: firstname fill_in 'last_name', with: lastname fill_in 'email', with: email fill_in 'user_password', with: password, :match => :first fill_in 'user_password_confirmation', :with => confirmation find("#user_referrer_url").set("/") click_button 'Register' end end end #/spec/factories/users.rb require 'faker' FactoryGirl.define do factory :user do |f| f.first_name { Faker::Name.first_name } f.last_name { Faker::Name.last_name } f.email { Faker::Internet.email } f.encrypted_password { Faker::Lorem.characters(10) } f.password { Faker::Lorem.characters(10) } f.primary_phone { Faker::PhoneNumber.cell_phone } f.alternate_phone { Faker::PhoneNumber.phone_number } f.role [0,1].sample f.agree_tos true confirmed_at = Time.now f.referrer_url ["/", "/visitors/owner-faq"].sample end end sign_up场景 返回request.referer,但是对于其他 <返回nil em> sign_in scenario (在问题中省略)。

我做错了什么?

2 个答案:

答案 0 :(得分:1)

可能你因为没有引用来自capybara的无头浏览器而遇到问题,因为你'直接打开'浏览器到new_user_registration_path导致一个零引用者。想象一下,点击word doc中的那个url,你的计算机用那个url打开chrome ...就没有推荐人了。

请尝试使用以下内容替换:visit new_user_registration_path

visit root_path
click_link('Sign Up')

然后它可能会有一个推荐人,你的测试将通过。

答案 1 :(得分:0)

您将路径作为参数传递以创建URL对象。

要使其正常工作,您需要将主机添加到您的引荐来源值。