I持って以下のRailsコントローラとビューコード:レールのActiveRecord参照minitestで
discussion_thread_controller.rb
class DiscussionThreadsController < ApplicationController
before_action :set_discussion_thread, only: [:show, :edit, :update, :destroy]
def show
end
private
# Use callbacks to share common setup or constraints between actions.
def set_discussion_thread
@discussion_thread = DiscussionThread.find(params[:id])
end
end
show.html.erb
<div class="panel panel-default">
<div class="panel-heading">
<%= @discussion_thread.author.name %><br>
<small><strong>at: </strong><%= @discussion_thread.created_at.strftime('%d-%m-%Y, %H:%M %P')%></small>
</div>
<div class="panel-body"><%= @discussion_thread.body %></div>
</div>
そしてこのminitest
class DiscussionThreadsControllerTest < ActionController::TestCase
setup do
@discussion_thread = discussion_threads(:one)
@board = boards(:board_2)
@user = users(:user_1)
end
test "should show discussion_thread" do
get :show, params: {id: @discussion_thread.id}
assert_response :success
end
end
ブラウザからコントローラにアクセスすると、たとえばhttp://localhost:3000/discussion_threads/980190963と表示され、ページが正しくレンダリングされます。テストが「作者」を実行したときに、デバッガでコードを通過するから、表示されます
Minitest::UnexpectedError: ActionView::Template::Error: undefined method `name' for nil:NilClass
でdiscussion_thread.author.name @レンダリングしようとすると、テストが失敗しているいくつかの理由
メソッドはnilを返し、ブラウザーからアクセスするときは対応する「User」オブジェクトを返します。また、@discussion_thread属性を調べると、有効な "author_id"が表示されます。
どうしてですか?
class DiscussionThread < ApplicationRecord
validates :title, presence: true
validates :author_id, presence: true
belongs_to :board, class_name: 'Board', foreign_key: 'board_id'
belongs_to :author, class_name: 'User', foreign_key: 'author_id'
has_many :replies, class_name: 'Post', foreign_key: 'thread_id', dependent: :destroy
end
と私のテストフィクスチャ:
discussion_threads.yml
one:
title: MyString
body: MyText
board: board_2
author: user_1
two:
title: MyString
body: MyText
board: board_2
author: user_1
と
user_1:
id: 1
username: admin
email_address: [email protected]
password_digest:...
name: Mr. Foo
is_admin: true