【发布时间】:2014-01-08 00:18:37
【问题描述】:
我已经设置了一个我正在测试的控制器,这样如果会话不存在,大多数对其操作的请求都会重定向到登录页面。
因此,在单元测试中测试控制器时,我需要使用sign_in 方法。我还需要在数据库中创建用户,以便他们可以登录。
这一切都可以像这样轻松实现:
describe MyController, do
let(:user) { FactoryGirl.create(:user)} # The 'create' creates in the database as well as in memory
context "with session" do
before {
sign_in user
}
context ".index" do
assigns(:example).should == "Just an example"
end
end
end
但是,这不是一个好的单元测试,因为它依赖于活动记录和数据库,以及 Devise 的测试辅助方法。
那么当我尝试测试控制器时,如何使用模拟(或其他东西)来阻止控制器重定向我?
我的控制器:
class MyController < ApplicationController
before_filter :authenticate_user!, only: [:index]
def index
@example = "Just an example"
end
end
【问题讨论】:
-
这是一个很好的自动化测试。永远不要模拟使用这样的生产代码无论如何都可以工作的东西。只模拟时钟或网络连接之类的东西。
-
但我不应该只测试我的控制器而不是控制器规范中的其他内容吗?
-
测试的目标是增加,而不是减少,如果你创建了一个错误,一些事情发生的几率。所以测试越多越好
-
我同意你的功能或请求规范,但不是单位规范。
标签: ruby-on-rails rspec