1

私自身の教育のために、Rails を使用して非常に単純なブログを作成しようとしています。チュートリアル以外で作成した Rails アプリはこれが初めてです。

これまでのところ、各投稿にはタイトルの文字列とコンテンツの文字列のみを持つ非常に単純なモデルしかありません。すべてが正常に機能し、ブラウザで期待どおりに動作しますが、テストに合格できません。

私のRspecコード(spec/requests/post_spec.rb)で失敗したテストは次のとおりです。

require 'spec_helper'

describe "Posts" do

  .
  .
  .

  describe "viewing a single post" do

    @post = Post.create(title: "The title", content: "The content")

    before { visit post_path(@post) }

    it { should have_selector('title',    text: @post.title) }
    it { should have_selector('h1',       text: @post.title) }
    it { should have_selector('div.post', text: @post.content) }

  end

end

これにより、3つすべてに対して同じエラーメッセージが表示されます。

Failure/Error: before { visit post_path(@post) }
     ActionController::RoutingError:
       No route matches {:action=>"show", :controller=>"posts", :id=>nil}

したがって、問題は @post = Post.create(...) 行が ID なしで投稿を作成しているか、投稿をテスト データベースに正しく保存していないことです。これを修正するにはどうすればよいですか? そもそも私はこれを正しい方法で行っているのでしょうか、それともテスト投稿を作成したりページをテストしたりするためのより良い方法はありますか?

これは、テストでのみ発生する問題です。ブラウザで 1 つの投稿を表示すると、すべて問題なく表示されます。投稿コントローラーは次のとおりです。(元の質問を投稿してから編集しました)

class PostsController < ApplicationController
  def new
    @post = Post.new
  end

  def create
    @post = Post.new(params[:post])
    if @post.save
      redirect_to posts_path, :notice => "Post successfully created!"
    end
  end

  def index
  end

  def show
    @post = Post.find(params[:id])
  end
end

Post モデル全体を次に示します。

class Post < ActiveRecord::Base
  attr_accessible :content, :title

  validates :content, presence: true
  validates :title,   presence: true
end

構成/ルート:

Blog::Application.routes.draw do
    resources :posts

    root to: 'posts#index'
end

アプリ/ビュー/投稿/show.html.erb:

<% provide(:title, @post.title) %>

<h1><%= @post.title %></h1>

<div class="post"><%= @post.content %></div>
4

3 に答える 3

2

インスタンス変数は before ブロックに入る必要があります。(テストは /posts/:id/show に移動しようとしています。この場合、@post が作成されていないため、params[:id] は nil です)

試す:

before do
    @post = Post.create(title: "The title", content: "The content") 
    visit post_path(@post)
end
于 2012-11-30T17:05:22.463 に答える
1

さて、あなたの新しいアクションと作成アクションは空のようです?? 試す

def new
@post =Post.new
end

def create
@post = Post.new(params[:post])
if @post.save
  redirect_to posts_path, :notice => " Post successfully created."
end
end

次に、新しいビューにはform_for@postが必要です

これなしで新しい投稿を作成することはできません。これが成功した場合にのみ、投稿にIDが割り当てられます。

于 2012-11-30T13:52:40.850 に答える
1

「前」のものをテストの外に置く必要がありますか? これは私のために働く:

require 'spec_helper'
describe "Posts" do

  before(:each) do 
    @post = Post.create(title: "The title", content: "The content")    
  end

  describe "viewing a single post" do
    it "should show the post details" do
      get post_path(@post) 
      response.status.should be(200)
      # do other tests here .. 
    end
  end
end
于 2012-11-30T15:18:15.327 に答える