ruby-on-rails - 如何测试模块在被 Controller 类包含时是否向 before_filter 添加方法

标签 ruby-on-rails ruby mocking rspec

我想知道你会如何解决这个任务

您想重构以下代码

class AController < ActionController::Base
  before_filter :the_method

protected
  def the_method
  end 
end

进入

class AController < ActionController::Base
  include TheModule
end

但作为 BDD 爱好者,您必须先编写规范

describe TheModule do
  context "when included" do
    it "adds #the_method as a before_filter" do

      # insert your code here

    end
  end
end

换句话说,问题是: 如何编写一个规范来检查 TheModel#the_method 在包含在一个类(大概是一个 Controller 类)中时是否被添加为 before_filter。

最佳答案

您可以检查回调调用的方法是否存在。

@model.methods.include?('before_callback_method_name')

然而,这只是检查回调运行的方法是否存在,而不是它的特定类型。

我找不到获取模型回调列表的方法。

如果存在回调,唯一的选择是测试模型是否按预期运行,即如果回调在更新时反转字符串,请检查字符串在更新时是否反转。

* 编辑 *

您可以像这样检索回调列表:

@u._validate_callbacks

它返回一个回调链,其中包括名称和重要的类型。

>> u._validate_callbacks.first.class
=> ActiveSupport::Callbacks::Callback
>> u._validate_callbacks.first.kind
=> :before
>> u._validate_callbacks.first.filter
=> :validate_associated_records_for_sites

如果现在加载,应该能够准确测试。

关于ruby-on-rails - 如何测试模块在被 Controller 类包含时是否向 before_filter 添加方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4143664/

相关文章:

reactjs - 无法使用 Jest 模拟 react 原生声音

c# - NSubstitute .Returns<T>() 是如何工作的?

ruby-on-rails - 在 Rails 环境之外测试(使用 RSpec) Controller

ruby-on-rails - rails : Rendering a template in a different namespace

ruby-on-rails - 如何登录设计以使用 Minitest 测试 Controller

ruby - 如何查找 ruby​​ 对象使用的内存?

ruby-on-rails - 将一个对象的多个值赋给另一个对象

ruby-on-rails - Vim E854 : path too long for completion

ruby-on-rails - 构建匹配链接数组

unit-testing - 在 AngularJS 2 中使用 AuthHttp 模拟 http 调用