【问题标题】:Rspec testing devise failing because assigns always nilRspec 测试设计失败,因为分配总是 nil
【发布时间】:2014-09-02 15:15:22
【问题描述】:

我正在用设计进行控制器测试,但它总是失败,因为分配总是返回 nil,请帮助找出问题所在,谢谢一百万!

posts_controller_spec.rb:

RSpec.describe PostsController, :type => :controller do
   describe "with valid session" do
      describe "GET index" do
         it "assigns all posts as @posts" do
            sign_in :admin, @user
            post = create(:post)
            get :index, {}
            expect(assigns(:posts)).to eq([post])
         end
      end
   end
   ...
end

posts_controller.rb

class PostsController < ApplicationController

   before_action :authenticate_user!
   before_action :set_post, only: [:show, :edit, :update, :destroy]

   # GET /posts
   # GET /posts.json
   def index
     @posts = Post.all
   end
   ...
end

我在 spec/rails_helper.rb 中包含了设计测试助手

config.include Devise::TestHelpers, type: :controller

在我的例子中,post 的范围是 admin,不确定这是否会有所不同(功能测试没有通过路由?),所以我只在此处包含我的 routes.rb

routes.rb:

Rails.application.routes.draw do
   root to: 'home#index'
   get 'admin', to: 'admin#index'
   devise_for :users
   scope '/admin' do
     resources :posts
   end
end

最后,rspec 的输出:

1) PostsController with valid session GET index assigns all posts as @posts
   Failure/Error: expect(assigns(:posts)).to eq([post])

   expected: [#<Post id: 57, title: "MyText", body: "MyText", image_url: "MyString", created_at: "2014-09-02 14:36:01", updated_at: "2014-09-02 14:36:01", user_id: 1>]
        got: nil

   (compared using ==)
 # ./spec/controllers/posts_controller_spec.rb:53:in `block (4 levels) in <top (required)>'

我已阅读此线程 rspec test of my controller returns nil (+factory girl) ,并按照建议将 get :index 更改为 controller.index 。建议是,如果通过测试,那就是路由问题。它确实通过了测试,但我仍然不知道路由问题出在哪里,以及为什么get :index 不起作用...

【问题讨论】:

    标签: ruby-on-rails rspec devise


    【解决方案1】:

    这只是一个小错误:在使用 devise sign_in 之前创建一个用户

    RSpec.describe PostsController, :type => :controller do
    
       describe "with valid session" do
    
         let (:user) { create(:user) }
    
          describe "GET index" do
             it "assigns all posts as @posts" do
               sign_in user
               post = create(:post)
               get :index, {}
               expect(assigns(:posts)).to eq([post])
             end
             ...
          end
       end
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-29
      • 2017-02-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多