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)>'
我的节目动作,通过测试。我在索引操作上的错误在哪里?
答案 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
个对象。此类实现count
和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立即运行查询。