Rails如何为openid创建测试?

时间:2013-09-30 19:54:52

标签: ruby-on-rails ruby unit-testing

我是Ruby(Rails)的新手,但是遵循RailsCast教程(#68)可以将OpenID登录添加到应用程序中。 现在我想创建一个测试( Test :: Unit ),我读了一些关于模拟和存根的测试,但我不确定我该怎么做。

这是会话控制器的外观:

def create
  if using_open_id?
    open_id_authentication(params[:openid_url])
  ...
  end
end

protected
def open_id_authentication(openid_url)    
  authenticate_with_open_id(...) do |result, identity_url, registration|
    if result.successful?
    ...
    end
  end
end

我创建了一个简单的测试,但无法测试'authenticate_with_open_id'中的块。

感谢任何帮助

2 个答案:

答案 0 :(得分:0)

在控制器测试中,您可以覆盖控制器上的一个方法,如下所示:

def @controller.some_method
  ..
end

因此您可以使用此技术删除authenticate_with_open_id方法。

现在假设您要为场景编写一个测试“为使用无法识别的身份URL成功打开ID登录创建新用户”我们需要使用一种方法来生成authenticate_with_open_id块的参数。 e.g。

class SuccessfulResult
  def successful?
    true
  end
end

def @controller.authenticate_with_open_id(url, options)
    yield SuccessfulResult.new, "NEW_IDENTITY", {'nickname' => 'testuser', 'email' => 'testuser@example.org' }
end

您还需要using_open_id?才能返回true,您可以通过存根或在请求中传递所需参数来执行此操作。

然后,您可以断言已经以通常的方式将额外的用户添加到数据库中。

答案 1 :(得分:0)

@mikej描述的技巧对我有用,如果你将它包装在setup块中进行测试,就像这样

require 'test_helper'

class PostsControllerTest < ActionController::TestCase

  #wrap in a setup block
  setup do
    def @controller.current_user
      User.first
    end
  end