我们在Ruby on Rails中有一个包含许多过滤器的大型应用程序。其中一些过滤器可能很复杂。我正在寻找一种通过单元测试单独测试这些滤波器的方法。现在我通过一个使用功能测试的动作测试它们来测试它们。这感觉不是正确的方式 有没有人有这方面的建议或经验?
答案 0 :(得分:3)
请记住,过滤器只是一种方法 鉴于此:
class SomeController
before_filter :ensure_awesomeness
...
end
没有理由你不能这样做:
SomeController.new.ensure_awesomeness
然后检查它是否调用redirect_to或者它应该做什么
答案 1 :(得分:1)
我很容易在单元测试before_filters上a post,你可能希望看看。希望它会有所帮助。
答案 2 :(得分:1)
您可以使用以下代码进行测试:
require "test_helper"
describe ApplicationController do
context 'ensure_manually_set_password' do
setup do
class ::TestingController < ApplicationController
def hello
render :nothing => true
end
end
NameYourApp::Application.routes.draw do
get 'hello', to: 'testing#hello', as: :hello
end
end
after do
Rails.application.reload_routes!
end
teardown do
Object.send(:remove_const, :TestingController)
end
context 'when user is logged in' do
setup do
@controller = TestingController.new
end
context 'and user has not manually set their password' do
let(:user) { FactoryGirl.build(:user, manually_set_password: false) }
setup do
login_as user
get :hello
end
should 'redirect user to set their password' do
assert_redirected_to new_password_path(user.password_token)
end
end
end
end
end
它的代码来自http://robots.thoughtbot.com/testing-a-before-filter, 我换了Rails 3
答案 3 :(得分:0)
这取决于您的过滤器正在做什么。
这:http://movesonrails.com/journal/2008/1/23/testing-your-application-controller-with-rspec.html
而且学习如何使用摩卡也会有很长的路要走。
答案 4 :(得分:0)
猎户座我曾经在几次事件中搞砸了。此外,大多数时间过滤器都是私有的,因此您必须执行发送:
SomeController.new.send(:some_filter)
答案 5 :(得分:0)
我遇到过这个问题。
执行需要请求的操作的过滤器怎么办?即使用Flash
Authlogic示例require_user方法不能仅使用ApplicationController.new.send(:some_filter)。
任何人都有一些关于如何孤立地测试这种东西的非黑客想法? (我是通过创建一个我只用于测试的额外虚拟控制器来实现的。)