1

我是 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”中的块。

感谢任何帮助

4

2 回答 2

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
于 2014-12-02T09:39:33.300 回答
0

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

def @controller.some_method
  ..
end

所以你可以使用这种技术来存根该authenticate_with_open_id方法。

现在假设您要为场景“创建一个新用户以使用无法识别的身份 URL 成功登录 Open ID”编写一个测试,我们需要authenticate_with_open_id使用一种方法来存根,该方法将为块产生适当的参数。例如

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,您可以通过存根或在请求中传递所需的参数来执行此操作。

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

于 2013-09-30T21:09:45.883 回答