我一直在为一些Rails控制器编写RSpec测试,并且我发现了确保Authlogic身份验证正常工作的强烈冲动。我也觉得我应该验证每个操作使用相同的应用程序范围布局。但是,在每个动作中为这种行为编写测试似乎很愚蠢。
我希望看到的是用于过滤器和布局的单行匹配器,类似于Shoulda用于关联和验证的匹配器。不幸的是,似乎没有这样的匹配器可用(除了this blog post中的过滤器的一些Test :: Unit宏)。我很想自己编写它们,但是找不到任何已经完成它的人会让我怀疑是否需要这样的匹配器。
所以我的问题是,你如何测试你的控制器的常见行为(如果你完全测试它),并且单线匹配测试过滤器和布局是否有用?我自己,我试图决定控制器规格中的单行与明确指定过滤器之间的关系,或者只是选择过滤器并忽略控制器中的过滤器和布局(因为它们只是一行代码)。
答案 0 :(得分:0)
我不喜欢为过滤器编写规范的想法 - 这似乎与实现过于接近。如果您使用TDD / BDD方法从头开始构建控制器,可能您已经先编写了操作,添加了一些逻辑(例如处理身份验证),然后意识到它应该进入过滤器。如果您的规范与“如果当前用户不是帐户用户拒绝索引请求”一致,那么您的规范应该能够执行(aircode)之类的操作:
current_user = Factory.create(:unauthorized)
controller.should_not receive(:index)
get :index
request.should redirect_to(some_safe_path)
操作是否使用过滤器并不重要。
您可以使用Rspec宏来干扰控制器规格。所以(更挥手):
describe MyController do
should_reject_anonymous(self)
...
end
module ControllerMacros
def should_reject_anonymous(test_controller)
describe test_controller, "Authentication" do
it "rejects index" do
test_controller.should_not_receive(:index)
get :index
response.should redirect_to(some_safe_path)
end
end
end
end