如何在Rails插件中测试视图?

时间:2008-11-05 21:52:14

标签: ruby-on-rails ruby testing plugins actionview

我正在编写一个包含一些部分内容的Rails插件。我想测试部分内容,但是我很难设置一个可以渲染它们的测试。没有相关的控制器,所以我只是假装一个:

require 'action_controller'
require 'active_support'
require 'action_pack'
require 'action_view'

class MyTest < Test::Unit::TestCase
  def setup
    @renderer = ActionController::Base.new
    @renderer.append_view_path File.expand_path(File.join(File.dirname(__FILE__), '..', 'views'))
  end

  def test_renders_link
    result = @renderer.render(:partial => '/something')
    assert ...
  end
end

:render电话总是爆炸。我尝试使用ActionView::Base而不是ActionController::Base,但这种情况的影响甚至更小。

有没有人取得任何成功?

4 个答案:

答案 0 :(得分:2)

结帐ActionView :: TestCase - http://api.rubyonrails.org/classes/ActionView/TestCase.html

您也可以使用它们来测试助手,我发现这些助手非常有帮助。

RSpec还有一种测试视图的方法:http://rspec.info/documentation/rails/writing/views.html

希望有所帮助!

答案 1 :(得分:1)

最终答案:

require 'action_controller'
require 'active_support'
require 'action_pack'
require 'action_view'
require 'action_controller/test_case'

class StubController < ActionController::Base
  helper MyHelper
  append_view_path '...'
  attr_accessor :thing
  def my_partial
    render :partial => '/my_partial', :locals => { :thing => thing }
  end
  def rescue_action(e) raise e end;
end

class MyTestCase < ActionController::TestCase
  self.controller_class = StubController
  def setup
    @controller.thing = ...
    get :my_partial
    assert ...
  end
end

答案 2 :(得分:0)

我最接近的是

require 'action_controller'
require 'active_support'
require 'action_pack'
require 'action_view'
require 'action_controller/test_case'

class StubController < ActionController::Base
  append_view_path '...'
  def _renderizer;  render params[:args];  end
  def rescue_action(e) raise e end;
end

class MyTest < ActionController::TestCase
  self.controller_class = StubController
  def render(args);  get :_renderizer, :args => args;  end 
  def test_xxx
    render :partial => ...
  end
end

但我现在收到路由错误:ActionController::RoutingError: No route matches {:action=>"_renderizer", :controller=>"", :args=>{:locals=>{:...}, :partial=>"/my_partial"}}

答案 3 :(得分:0)

我建议您查看resource_controller plugin的代码。我也在其他一些插件中看到了这种方法。

答案很简单,在测试目录中,您创建了一个使用您的插件的应用。从那里,您只需使用常用工具来测试Rails视图。

如果您的插件没有很多不同的用例,测试应用程序可以非常简单。在更复杂的插件(如resource_controller)的情况下,您可能需要创建相当多的不同控制器等等。

要欺骗您的测试应用加载插件,最简单的方法是在测试应用的插件目录中创建指向r_c目录根目录的链接。这不适用于Windows,只适用于POSIX操作系统。