【发布时间】:2022-11-20 22:38:12
【问题描述】:
我面临一个非常奇怪的问题,我在这里找不到答案。我正在尝试在我的 Rails API 应用程序中使用 Minitest 进行简单测试。
我有两个简单的模型,一个是电影:
class CreateMovies < ActiveRecord::Migration[7.0]
def change
create_table :movies do |t|
t.string :title
t.text :synopsis
t.datetime :launch_date
t.string :age_classification
t.string :length
t.string :genre
t.string :director
t.string :poster
t.decimal :rating_avg
t.timestamps
end
end
end
另一个是会话
class CreateSessions < ActiveRecord::Migration[7.0]
def change
create_table :sessions do |t|
t.references :movie, null: false, foreign_key: true
t.text :times
t.text :dates
t.timestamps
end
end
end
测试“应该创建会话”自动生成测试函数:
class SessionsControllerTest < ActionDispatch::IntegrationTest
setup do
@movie = movies(:one)
@session = sessions(:one)
end
test "should create session" do
assert_difference("Session.count") do
post sessions_url, params: { session: { dates: @session.dates, movie_id: @session.movie_id, times: '21:00' } }, as: :json
end
assert_response 201
end
end
我遇到以下错误:
Minitest::UnexpectedError: ActiveRecord::RecordInvalid: Validation failed: Movie must exist
电影.yml
one:
title: Avatar
synopsis: A paraplegic Marine dispatched to the moon Pandora on a unique mission becomes torn between following his orders and protecting the world he feels is his home
launch_date: 18/12/2009
age_classification: +13
length: 162
genre: Action
director: James Cameron
poster: https://m.media-amazon.com/images/M/MV5BNjA3NGExZDktNDlhZC00NjYyLTgwNmUtZWUzMDYwMTZjZWUyXkEyXkFqcGdeQXVyMTU1MDM3NDk0._V1_SX300.jpg
rating_avg: 8.0
会话.yml
one:
movie: one
times: 16:00
dates: 17/07/2022
我已确保 Movie 存在时邮政行正在执行,但不知道为什么会这样。有任何想法吗?
PD:在 Ruby 3.1.2 和 Ruby On Rails 7.0.4 上运行
我试图在邮政声明它没有工作。我还尝试在控制器创建会话时输出电影是否存在于控制器中,但它不会保存会话,因为ActiveRecord::RecordInvalid: Validation failed: Movie must exist。
【问题讨论】:
-
您在控制器中的
session_params(强参数)方法是什么样的? -
@spickermann 感谢您的回答!看起来像这样
params.permit(:movie_id, :times, :dates)
标签: ruby-on-rails ruby testing minitest ruby-on-rails-7