失败/错误:分配(:帖子).should eq([post])

时间:2013-04-29 18:41:25

标签: ruby-on-rails ruby ruby-on-rails-3 rspec capybara

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)>'

我的节目动作,通过测试。我在索引操作上的错误在哪里?

2 个答案:

答案 0 :(得分:0)

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

您可以尝试转换assings[:posts],如下所示:

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

但由于阵列不一样,我认为它也不会起作用。

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

assings[:posts].should include(post)

答案 1 :(得分:0)

Mongoid在获取数据之前不会获取数据。这意味着,当您执行Model.where时,您将获得Mongoid::Criteria个对象。此类实现counteach(还包括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.findModel.find_by将返回单个对象,或者如果该对象不存在则引发异常;所以Mongoid立即运行查询。