加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – ArgumentError:序列未注册:电子邮件

发布时间:2020-12-17 03:15:40 所属栏目:百科 来源:网络整理
导读:我运行rspec时不断收到此错误:序列未注册:电子邮件. 但是,我确实在我的factories.rb文件中设置了它.有想法该怎么解决这个吗?该应用程序运行正常. Failures: 1) UsersController GET 'index' for signed-in-users should be successful Failure/Error: @us
我运行rspec时不断收到此错误:序列未注册:电子邮件.

但是,我确实在我的factories.rb文件中设置了它.有想法该怎么解决这个吗?该应用程序运行正常.

Failures:

  1) UsersController GET 'index' for signed-in-users should be successful
     Failure/Error: @users << Factory(:user,:email => Factory.next(:email))
     ArgumentError:
       Sequence not registered: email
     # ./spec/controllers/users_controller_spec.rb:28:in `block (5 levels) in <top (required)>'
     # ./spec/controllers/users_controller_spec.rb:27:in `times'
     # ./spec/controllers/users_controller_spec.rb:27:in `block (4 levels) in <top (required)>'

  2) UsersController GET 'index' for signed-in-users should have the right title
     Failure/Error: @users << Factory(:user,:email => Factory.next(:email))
     ArgumentError:
       Sequence not registered: email
     # ./spec/controllers/users_controller_spec.rb:28:in `block (5 levels) in <top (required)>'
     # ./spec/controllers/users_controller_spec.rb:27:in `times'
     # ./spec/controllers/users_controller_spec.rb:27:in `block (4 levels) in <top (required)>'

  3) UsersController GET 'index' for signed-in-users should have an element for each user
     Failure/Error: @users << Factory(:user,:email => Factory.next(:email))
     ArgumentError:
       Sequence not registered: email
     # ./spec/controllers/users_controller_spec.rb:28:in `block (5 levels) in <top (required)>'
     # ./spec/controllers/users_controller_spec.rb:27:in `times'
     # ./spec/controllers/users_controller_spec.rb:27:in `block (4 levels) in <top (required)>'

  4) UsersController GET 'index' for signed-in-users should paginate users
     Failure/Error: @users << Factory(:user,:email => Factory.next(:email))
     ArgumentError:
       Sequence not registered: email
     # ./spec/controllers/users_controller_spec.rb:28:in `block (5 levels) in <top (required)>'
     # ./spec/controllers/users_controller_spec.rb:27:in `times'
     # ./spec/controllers/users_controller_spec.rb:27:in `block (4 levels) in <top (required)>'

Finished in 2.88 seconds
80 examples,4 failures

factories.rb:

Factory.define :user do |user|
    user.name "Pavan Katepalli"
    user.email "email@pavan.com"
    user.password "foobar"
    user.password_confirmation "foobar"
end

Factory.sequence :email do |n|
  "person-#{n}@example.com"
end

users_controller_spec.rb:

require 'spec_helper'

describe UsersController do

    render_views

    describe "GET 'index'" do
        # book's way is on page 386 
        # I used the repo's way
        describe "for non-signed-in users" do
            it "should deny access" do
                get :index
                response.should redirect_to(signin_path)
                flash[:notice].should =~ /sign in/i
            end
        end

        describe "for signed-in-users" do

            before(:each) do
                @user = test_sign_in(Factory(:user))
                second = Factory(:user,:email => "another@example.com")
                third  = Factory(:user,:email => "another@example.net")

                @users = [@user,second,third]

                30.times do
                    @users << Factory(:user,:email => Factory.next(:email))
                end


            end

            it "should be successful" do
                get :index
                response.should be_success
            end

            it "should have the right title" do
                get :index
                response.should have_selector('title',:content => "All users")
            end

            it "should have an element for each user" do
                get :index
                @users[0..2].each do |user|
                #User.paginate(:page => 1).each do |user|
                    response.should have_selector('li',:content => user.name)
                end
            end

            it "should paginate users" do
                get :index
                response.should have_selector('div.pagination')
                response.should have_selector('span.disabled',:content => "Previous")
                #response.should have_selector('a',:href => "/users?page=2",#                                   :content => "2")
                #response.should have_selector('a',#                                   :content => "Next")
            end
=begin
            it "should have delete links for admins" do
                @user.toggle!(:admin)
                other_user = User.all.second
                get :index
                response.should have_selector('a',:href => user_path(other_user),:content => "delete")
            end

            it "should not have delete links for non-admins" do
                other_user = User.all.second
                get :index
                response.should_not have_selector('a',:content => "delete")
            end
=end
        end
    end

    describe "GET 'show'" do

        before(:each) do
          # used to be just Factory.build(:user)
          @user = Factory(:user)
        end

        it "should be successful" do
          get :show,:id => @user.id
          response.should be_success
        end

        it "should find the right user" do
          get :show,:id => @user.id

          # assigns(:user) returns the 
          # value of the instance variable @user
          assigns(:user).should == @user
        end

        it "should have the right title" do
          get :show,:id => @user.id
          response.should have_selector('title',:content => @user.name)
        end

        it "should have the user's name" do
          get :show,:id => @user.id
          response.should have_selector('h1',:content => @user.name)
        end

        it "should have a profile image" do
          get :show,:id => @user.id
          response.should have_selector('h1>img',:class => "gravatar")
        end
    end

    describe "GET 'new'" do

        it "should be successful" do
          get :new
          response.should be_success
        end

        it "should have the right title" do
          get :new
          response.should have_selector('title',:content => "Sign Up")
        end
    end

    describe "POST 'create'" do

        describe "failure" do

            before(:each) do
                @attr = { :name => "",:email => "",:password => "",:password_confirmation => "" }
            end

            it "should not create a user" do
                lambda do
                    post :create,:user => @attr
                end.should_not change(User,:count)
            end

            it "should have the right title" do
                post :create,:user => @attr
                response.should have_selector('title',:content => "Sign up")
            end

            it "should render the 'new' page" do
                post :create,:user => @attr
                response.should render_template('new')
            end
        end

        describe "success" do

            before(:each) do
                @attr = { :name => "New User",:email => "user@example.com",:password => "foobar",:password_confirmation => "foobar" }
            end

            it "should create a user" do
                lambda do
                    post :create,:user => @attr
                end.should change(User,:count).by(1)
            end

            it "should redirect to the user show page" do
                post :create,:user => @attr
                response.should redirect_to(user_path(assigns(:user)))
            end

            it "should have a welcome message" do
                post :create,:user => @attr
                flash[:success].should =~ /welcome to the sample app/i
            end

            it "should sign the user in" do
                post :create,:user => @attr
                controller.should be_signed_in
            end

        end
    end

    describe "GET 'edit'" do

        before(:each) do
            @user = Factory(:user)
            test_sign_in(@user)
        end

        it "should be successful" do
            get :edit,:id => @user
            response.should be_success
        end

        it "should have the right title" do
            get :edit,:id => @user
            response.should have_selector('title',:content => "Edit user")
        end

        it "should have a link to change the Gravatar" do
            get :edit,:id => @user
            gravatar_url = "http://gravatar.com/emails"
            response.should have_selector('a',:href => 'http://gravatar.com/emails',:content => "change")
        end
    end



    describe "PUT 'update'" do

        before(:each) do
            @user = Factory(:user)
            test_sign_in(@user)
        end

        describe "failure" do

            before(:each) do
                @attr = { :email => "",:name => "",:password_confirmation => "" }
            end

            it "should render the 'edit' page" do
                put :update,:id => @user,:user => @attr
                response.should render_template('edit')
            end

            it "should have the right title" do
                put :update,:content => "Edit user")
            end
        end

        describe "success" do

            before(:each) do
                @attr = { :name => "New Name",:email => "user@example.org",:password => "barbaz",:password_confirmation => "barbaz" }
            end

            it "should change the user's attributes" do
                put :update,:user => @attr
                @user.reload
                @user.name.should  == @attr[:name]
                @user.email.should == @attr[:email]
                #@user.encrypted_password.should == assigns(:user).encrypted_password
            end

            it "should redirect to the user show page" do
                put :update,:user => @attr
                response.should redirect_to(user_path(@user))
            end

            it "should have a flash message" do
                put :update,:user => @attr
                flash[:success].should =~ /updated/
            end
        end
    end

    describe "authentication of edit/update actions" do

        before(:each) do
            @user = Factory(:user)
        end

        describe "for non-signed-in users" do

            it "should deny access to 'edit'" do
                get :edit,:id => @user
                response.should redirect_to(signin_path)
                #flash[:notice].should =~ /sign in/i
            end

            it "should deny access to 'update'" do
                put :update,:user => {}
                response.should redirect_to(signin_path)
            end
        end

        describe "for signed-in users" do

            before(:each) do
                wrong_user = Factory(:user,:email => "user@example.net")
                test_sign_in(wrong_user)
            end

            it "should require matching users for 'edit'" do
                get :edit,:id => @user
                response.should redirect_to(root_path)
            end

            it "should require matching users for 'update'" do
                put :update,:user => {}
                response.should redirect_to(root_path)
            end
        end
    end
end

解决方法

将序列放在define块中?

FactoryGirl.define do

  sequence :email { |n| "person-#{n}@example.com" }

  factory :user do
    name "Pavan Katepalli"
    password "foobar"
    password_confirmation "foobar"
    email { FactoryGirl.generate(:email) }
  end

end

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读