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 的帖子,或者它没有正确地将帖子保存到测试数据库中。我该如何解决?我是否首先以正确的方式解决这个问题,还是有更好的方法可以创建测试帖子/测试页面?

这只是测试中的一个问题。当我在浏览器中查看单个帖子时,一切看起来都很好。Posts 控制器是:(自发布原始问题以来,我已对其进行了编辑)

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

应用程序/views/posts/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 和 params[:id] 在这种情况下是 nil,因为 @post 尚未创建)

尝试:

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

好的,看来您的 new 和 create 操作是空的?尝试

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 回答