1

post_controller_spec.rb

require 'spec_helper'
describe Blog::PostsController do
  let!(:posts) { FactoryGirl.create_list(:post, 3) }
  let!(:post) { posts.first }
  describe "GET index" do
    it "renders the :index view" do
      get :index
      assigns(:posts).should eq([post])
      response.should render_template :index
    end
  end
 describe "GET show" do
  context "invalid post" do
    before do
      get :show, :id => 99
    end
    it "redirects to the 404 page" do
    response.should render_template(:file => "#{Rails.root}/public/404.html")
    end
  end
  context "valid post" do
    it "show page" do
      get :show, id: post
        assigns(:post).should eq(post)
        response.should render_template :show
      end
    end
  end
end

这是我的索引操作:

def index
    @posts = Post.all.order_by(created_at: :desc).page(params[:page])
    respond_to do |format|
      format.html
    end
  end

我收到此错误:

1) Blog::PostsController GET index renders the :index view
 Failure/Error: assigns(:posts).should eq([post])

   expected: [#<Post _id: 517ebb98a616542f41000002, created_at: 2013-04-29 18:27:36 UTC, updated_at: 2013-04-29 18:27:36 UTC, image_filename: nil, impressions_count: nil, tags: ["tag1", "tag2", "tag3", "tag4"], _slugs: ["post-number-1"], title: "Post number 1", content: "[\"Maiores dolor illum distinctio eveniet perspiciatis necessitatibus consequatur. Dicta ratione repellat ullam sit sed inventore voluptatem. Possimus magni cum dolores rerum voluptas quibusdam. Sed rerum atque accusantium amet aut.\", \"Consequatur ab eum voluptatem voluptatem sit et. Natus soluta quam sed quasi vel odio assumenda. Nulla excepturi dicta voluptatem voluptas vel sit.\"]", image: nil, image_cache: nil, remove_image: nil, admin_id: "517ebb98a616542f41000001">]
        got: #<Mongoid::Criteria
     selector: {}
     options:  {:sort=>{"created_at"=>-1}, :limit=>9, :skip=>0}
     class:    Post
     embedded: false>


   (compared using ==)

   Diff:
   @@ -1,2 +1,6 @@
   -[#<Post _id: 517ebb98a616542f41000002, created_at: 2013-04-29 18:27:36 UTC, updated_at: 2013-04-29 18:27:36 UTC, image_filename: nil, impressions_count: nil, tags: ["tag1", "tag2", "tag3", "tag4"], _slugs: ["post-number-1"], title: "Post number 1", content: "[\"Maiores dolor illum distinctio eveniet perspiciatis necessitatibus consequatur. Dicta ratione repellat ullam sit sed inventore voluptatem. Possimus magni cum dolores rerum voluptas quibusdam. Sed rerum atque accusantium amet aut.\", \"Consequatur ab eum voluptatem voluptatem sit et. Natus soluta quam sed quasi vel odio assumenda. Nulla excepturi dicta voluptatem voluptas vel sit.\"]", image: nil, image_cache: nil, remove_image: nil, admin_id: "517ebb98a616542f41000001">]
   +#<Mongoid::Criteria
   +  selector: {}
   +  options:  {:sort=>{"created_at"=>-1}, :limit=>9, :skip=>0}
   +  class:    Post
   +  embedded: false>

 # ./spec/controllers/blog/posts_controller_spec.rb:8:in `block (3 levels) in <top (required)>'

我的表演动作,通过测试。索引操作的错误在哪里?

4

2 回答 2

0

Mongoid 在绝对必须之前不会获取数据。所以这意味着,当你Model.where返回一个Mongoid::Criteria对象时。此类实现countand each(也包括Enumerable),因此它的行为通常类似于Array,但事实并非如此。您需要使用to_a.

这应该可以解决错误:

describe "GET index" do
  it "renders the :index view" do
    get :index
    assigns(:posts).to_a.should match_array posts
    response.should render_template :index
  end
end

您的 show 操作起作用的原因是Model.find, 并且Model.find_by将返回单个对象,或者如果该对象不存在则引发异常;所以 Mongoid 立即运行查询。

于 2013-04-29T22:01:23.053 回答
0

这是因为您正在尝试比较不同类型的对象。

您可以尝试assings[:posts]像这样转换:

assings[:posts].to_a.should eq([post])

但是由于数组不一样,我认为它也行不通。

因此,您可以尝试验证是否post在内部assings[:post]

assings[:posts].should include(post)
于 2013-04-29T20:49:12.953 回答