Rails 将 id 传递给 rspec 测试

Spa*_*nce 0 ruby rspec ruby-on-rails

嘿,我正在尝试使用 rspec 测试我的new操作,但遇到了一些麻烦。

这是new我的scores_controllerA 分数的操作,该操作也将与某个网站相关联。一个site has_many scoresscore belongs_to一个site

def new
    @score = Score.new(site: Site.find(params['site_id']))
  end
Run Code Online (Sandbox Code Playgroud)

这是我目前的 rspec 测试:

describe 'new' do
    with :user
    with :score
    with :site
    before do
      sign_in user
      get :new, id: site.id
    end
    it { expect(response).to have_http_status :ok }
    it { should render_template :new }
    it 'assigns a new score as @score' do
      expect(assigns(:score)).to be_a_new(Score)
    end
  end
Run Code Online (Sandbox Code Playgroud)

这是我收到的错误

1) ScoresController new
     Failure/Error: @score = Score.new(site: Site.find(params['site_id']))

     ActiveRecord::RecordNotFound:
       Couldn't find Site with 'id'=
     # ./app/controllers/scores_controller.rb:19:in `new'
     # ./spec/controllers/scores_controller_spec.rb:41:in `block (3 levels) in <top (required)>'
     # ./spec/spec_helper.rb:31:in `block (3 levels) in <top (required)>'
     # ./spec/spec_helper.rb:30:in `block (2 levels) in <top (required)>'
Run Code Online (Sandbox Code Playgroud)

我知道id: site.id这是错误的,但我不知道如何用 a 来测试它,site_id我对 Rails 也很陌生,如果它非常明显,我很抱歉。

如果需要的话,这是我的架构

create_table "scores", force: :cascade do |t|
    t.integer  "value",      null: false
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.integer  "site_id"
    t.string   "response"
  end

  add_index "scores", ["site_id"], name: "index_scores_on_site_id", using: :btree

  create_table "sites", force: :cascade do |t|
    t.string   "name"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end
Run Code Online (Sandbox Code Playgroud)

编辑:这是我的路线

                  Prefix Verb   URI Pattern                    Controller#Action
                    root GET    /                              sites#index
                   sites GET    /sites(.:format)               sites#index
                         POST   /sites(.:format)               sites#create
                new_site GET    /sites/new(.:format)           sites#new
               edit_site GET    /sites/:id/edit(.:format)      sites#edit
                    site GET    /sites/:id(.:format)           sites#show
                         PATCH  /sites/:id(.:format)           sites#update
                         PUT    /sites/:id(.:format)           sites#update
                         DELETE /sites/:id(.:format)           sites#destroy
                  scores GET    /scores(.:format)              scores#index
                         POST   /scores(.:format)              scores#create
               new_score GET    /scores/new(.:format)          scores#new
              edit_score GET    /scores/:id/edit(.:format)     scores#edit
                   score GET    /scores/:id(.:format)          scores#show
                         PATCH  /scores/:id(.:format)          scores#update
                         PUT    /scores/:id(.:format)          scores#update
                         DELETE /scores/:id(.:format)          scores#destroy
        new_user_session GET    /users/sign_in(.:format)       devise/sessions#new
            user_session POST   /users/sign_in(.:format)       devise/sessions#create
    destroy_user_session DELETE /users/sign_out(.:format)      devise/sessions#destroy
           user_password POST   /users/password(.:format)      devise/passwords#create
       new_user_password GET    /users/password/new(.:format)  devise/passwords#new
      edit_user_password GET    /users/password/edit(.:format) devise/passwords#edit
                         PATCH  /users/password(.:format)      devise/passwords#update
                         PUT    /users/password(.:format)      devise/passwords#update
cancel_user_registration GET    /users/cancel(.:format)        devise/registrations#cancel
       user_registration POST   /users(.:format)               devise/registrations#create
   new_user_registration GET    /users/sign_up(.:format)       devise/registrations#new
  edit_user_registration GET    /users/edit(.:format)          devise/registrations#edit
                         PATCH  /users(.:format)               devise/registrations#update
                         PUT    /users(.:format)               devise/registrations#update
                         DELETE /users(.:format)               devise/registrations#destroy
Run Code Online (Sandbox Code Playgroud)

spi*_*ann 5

只需更改这一行

get :new, id: site.id
Run Code Online (Sandbox Code Playgroud)

get :new, site_id: site.id
Run Code Online (Sandbox Code Playgroud)

因为在你的new方法中你加载了Siteby params[:site_id]

  • 在较新的版本中: `get :new, params: { site_id: site.id }` (2认同)