Spa*_*nce 0 ruby rspec ruby-on-rails
嘿,我正在尝试使用 rspec 测试我的new操作,但遇到了一些麻烦。
这是new我的scores_controllerA 分数的操作,该操作也将与某个网站相关联。一个site has_many scores和score 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)
只需更改这一行
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]。
| 归档时间: |
|
| 查看次数: |
3838 次 |
| 最近记录: |