【问题标题】:How to run minitest for controller methods?如何为控制器方法运行 minitest?
【发布时间】:2015-09-20 14:02:56
【问题描述】:

post_controller 文件

class PostsController < ActionController::Base
before_action :authenticate_user!

def index
 @post = current_user.posts.paginate(page: params[:page], per_page: 5)
 respond_to do |format|
   format.html
   format.json { render json: @post }
 end
end

def new
 @post = Post.new
end

def create
 @post = current_user.posts.build(post_param)
 if @post.save
   redirect_to action: 'index'
 else
   render 'new'
 end

post_controller_test

require 'test_helper'

class PostsControllerTest < ActionController::TestCase
include Devise::TestHelpers

def setup
 @user  = users(:Bob)
 @post = Post.new
end  #passed

test 'logged in should get show' do
 sign_in @user
 get :index
 assert_response :success
end  #passed

test 'not authenticated should get redirect' do
 get :index
 assert_response :redirect
end   #passed  

test 'should get index' do
 get :index
 assert_response :success
 assert_not_nil assigns(:posts)
end   #failing

test "should destroy post" do
 assert_difference('Post.count', -1) do
 delete :destroy, id: @post
end

assert_redirected_to posts_path
end   #failing
...  

devise 已设置并且工作正常,但为什么我在最后两种情况下收到 302 错误。是因为我没有将@user 参数传递给它吗?我做到了,但它仍然抛出同样的错误。我还检查了我的routes 文件,这很好,因为post_controller 在开发模式下工作正常。

我在这里做错了什么?

编辑-1

我尝试为create 方法创建测试用例

def setup
 @user = users(:bob)
 @p = posts(:one)
 @post = Post.new  
end

test 'should create post' do
 sign_in @user
 assert_difference('Post.count') do
  post :create, post: { name: @p.name, value: @p.value}
end
end

我得到ActionController::ParameterMissing: param is missing or the value is empty: post,而在我的控制器类中我确实有

 params.require(:post).permit(:name, :value, :user_id)

我的.yml 文件中也有所有参数,即

 one:
  name: 2
  value: 3

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4 devise


    【解决方案1】:

    您似乎需要先登录才能尝试索引操作。您还在测试错误的实例变量名称。您正在测试@posts,但您已经在控制器中定义了@post。试试这个测试:

    test 'should get index' do
      sign_in @user
      get :index
      assert_response :success
      assert_not_nil assigns(:post)
    end
    

    【讨论】:

    • 感谢您的回答。请查看Edit-1 部分
    • 我认为您需要将 :row 添加到您的许可证中!论据
    • 其实已经有了,是打字错误,因为我那里的参数太多了..只是想在这里粘贴几个
    • 还有为什么是params.require(:simulation) 而不是params.require(:post)?另一个错字?
    • 错误提示 params[:post] 为空,因此请仔细检查您是否实际使用了 post :create, post: { name: @p.name, value: @p.value}
    猜你喜欢
    • 1970-01-01
    • 2014-11-26
    • 2018-06-28
    • 1970-01-01
    • 2014-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多