我如何使用AuthLogic控制器规格型号模拟?(How can I use mock models

2019-07-29 02:31发布

我试图写一个控制器的规格,而无需使用固定装置(而不是采用模拟模型)。 该控制器需要将登录用户的,我采用了哪些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合适吗?

Answer 1:

伊恩发布了解决方案,使用模拟对象与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我不想回答我的问题,但是这是我一直在寻找的答案; 我只是没有发现它早够了。



Answer 2:

Authlogic预计记录像是一个活跃的记录实例的行为。 您可以使用真实的实例,或者是模拟,但如果你使用一个模拟/存根必须确保它回应所有Authlogic所需的方法。

我建议,而不是使用一个模拟真实的活动记录的对象。 如果你不希望使用夹具,你可以使用一个工厂。

最后的选择将是传递响应任何方法模拟(你可以很容易地通过method_missing的做到这一点)。 与解决方案的问题是,你不提前知道哪个值应返回任何特定的方法调用。

是的,你可以通过虚假的,但是这是不是一个真正的解决方案。 这将需要尝试手动/直到找到模仿对象,回答所有Authlogic请求添加默认值。 但是这需要你不断地遵循authlogic任何内部变革来解决你的存根未接来电。



Answer 3:

在Rails 3这个嘲讽UserSession的不工作了,因为AuthLogic的UserSession不是的ActiveRecord :: Base的实例。 解决这个问题对我的作品:

class UserSession < Authlogic::Session::Base
  extend ActiveModel::Naming
end


Answer 4:

我发现嘲讽authlogic对象是人努力,我最终放弃了嘲讽。 相反,我现在用的发电机的方法使用对象的爸爸 。 我的功能测试,现在更快乐。 BTW, 早该 + object_daddy绝对岩石。 早该的事务上下文确保我的测试数据库保持干净,我也没有嘲笑首先简单的ActiveRecord对象。



文章来源: How can I use mock models in AuthLogic controller specs?