我试图写一个控制器的规格,而无需使用固定装置(而不是采用模拟模型)。 该控制器需要将登录用户的,我采用了哪些AuthLogic ,按照笔者的建议 。
describe UsersController do
def mock_user(stubs={})
@mock_user ||= mock_model(User, stubs)
end
context 'when logged in' do
before { activate_authlogic }
it "exposes the logged-in user as @user in response to GET (show)" do
UserSession.create(mock_user)
...
end
...
end
...
end
这些例子都不能在该行UserSession.create(...)
以效果报告:
Mock 'User_1005' received unexpected message :changed? with (no args)
我不知道如何解决这个; 与嘲讽:changed? => false
:changed? => false
合适吗?
伊恩发布了解决方案,使用模拟对象与AuthLogic 。 以另一种方式,下面的助手进入spec_helpers.rb
:
def current_user(stubs = {})
@current_user ||= mock_model(User, stubs)
end
def user_session(stubs = {}, user_stubs = {})
@current_user_session ||= mock_model(UserSession, {:user => current_user(user_stubs)}.merge(stubs))
end
def login(session_stubs = {}, user_stubs = {})
UserSession.stub!(:find).and_return(user_session(session_stubs, user_stubs))
end
def logout
@user_session = nil
end
我已经将这一进我的规格,我觉得这不正是我希望。 我有exploy为登录用户模拟模型的工作控制器的规格,所以现在他们并不都休息的时候我添加一个字段到用户。 在规范实施此的伊恩的例子是:
describe SecretsController do
before { login }
it "should be very very secret!"
end
PS我不想回答我的问题,但是这是我一直在寻找的答案; 我只是没有发现它早够了。
Authlogic预计记录像是一个活跃的记录实例的行为。 您可以使用真实的实例,或者是模拟,但如果你使用一个模拟/存根必须确保它回应所有Authlogic所需的方法。
我建议,而不是使用一个模拟真实的活动记录的对象。 如果你不希望使用夹具,你可以使用一个工厂。
最后的选择将是传递响应任何方法模拟(你可以很容易地通过method_missing的做到这一点)。 与解决方案的问题是,你不提前知道哪个值应返回任何特定的方法调用。
是的,你可以通过虚假的,但是这是不是一个真正的解决方案。 这将需要尝试手动/直到找到模仿对象,回答所有Authlogic请求添加默认值。 但是这需要你不断地遵循authlogic任何内部变革来解决你的存根未接来电。
在Rails 3这个嘲讽UserSession的不工作了,因为AuthLogic的UserSession不是的ActiveRecord :: Base的实例。 解决这个问题对我的作品:
class UserSession < Authlogic::Session::Base
extend ActiveModel::Naming
end
我发现嘲讽authlogic对象是人努力,我最终放弃了嘲讽。 相反,我现在用的发电机的方法使用对象的爸爸 。 我的功能测试,现在更快乐。 BTW, 早该 + object_daddy绝对岩石。 早该的事务上下文确保我的测试数据库保持干净,我也没有嘲笑首先简单的ActiveRecord对象。