gpt4 book ai didi

ruby-on-rails - 在过滤器之前设置实例变量的Rails测试 Controller 方法

转载 作者:行者123 更新时间:2023-12-03 10:07:10 26 4
gpt4 key购买 nike

好的,所以我的主要问题是我已经在项目中实现了Mailboxer以处理消息传递,并且我正在尝试为此编写测试。但是,我一直反复绊脚石。我尝试了几种不同的 stub /模拟,但没有取得任何进展。

我们有一个conversations_controller.rb,它依赖于before_filters来设置执行每个操作所需的所有实例变量。然后,在 Controller 操作中,直接引用实例变量以执行任何类型的操作或返回特定数据。

这是我们的索引操作的示例,该操作返回在另一个before_filter中指定的邮箱的before_filter中指定的“box”中的所有对话:

class ConversationsController < ::ApplicationController
before_filter :get_user_mailbox, only: [:index, :new_message, :show_message, :mark_as_read, :mark_as_unread, :create_message, :reply_message, :update, :destroy_message, :untrash]
before_filter :get_box

def index
if @box.eql? "inbox"
@conversations = @mailbox.inbox
elsif @box.eql? "sentbox"
@conversations = @mailbox.sentbox
else
@conversations = @mailbox.trash
end
end

在过滤器之前:
private
def get_user_mailbox
@user = User.where(:user_name => user.user_name.downcase).where(:email => user.email.downcase).first_or_create
@mailbox = @user.mailbox if @user
end

def get_box
if params[:box].blank? or !["inbox","sentbox","trash"].include?params[:box]
params[:box] = 'inbox'
end
@box = params[:box]
end

所以我想我有两个问题。首先,如何获取测试以生成索引操作所需的正确数据@ mailbox,@ user和@box。接下来,如何传递假参数以将@box设置为不同的“收件箱/发件箱/垃圾箱”。我已经尝试使用controller.index({box:“inbox”}),但总是收到“错误的参数1代表0”的消息。

我以各种不同的方式尝试了以下操作,但始终会出现nil:class错误,这意味着我的实例变量肯定没有正确设置。
describe "GET 'index' returns correct mailbox box" do
before :each do
@user = User.where(:user_name => 'test').where(:email => 'test@test.com').first_or_create
@mailbox = @user.mailbox
end

it "#index returns inbox when box = 'inbox'" do
mock_model User
User.stub_chain(:where, :where).and_return(@user)
controller.index.should == @mailbox.inbox
end
end

最佳答案

过滤器和回调很难测试和调试。尽可能避免使用它们。

在这种情况下,我认为您的before_filter不是必需的,因此无需对其进行测试。这些方法最好的归宿是模型。

检查我的配料:

class User < ActiveRecord::Base
delegate :inbox, :sentbox, :trash, to: :mailbox
end

class ConversationsController < ::ApplicationController
def index
@conversations = current_user.send get_box
end

private
def get_box
# your code
end
end

就这样。应该足够了。

然后,您可以定期进行测试。

关于ruby-on-rails - 在过滤器之前设置实例变量的Rails测试 Controller 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18337472/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com