2013-09-30 2 views
1

Я новичок в Ruby (Rails), но после учебника RailsCast (# 68) можно добавить логин OpenID в приложение. Теперь я хотел бы создать тест (Test :: Unit), я прочитал некоторые о насмешках и заглушках, но я не очень уверен, как мне следует продолжить.Рельсы, как создать тест для openid?

Это как контроллер сеанса выглядит:

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».

Цените помощь

+0

Вы хотите, чтобы сделать эти тесты как функциональный (контроллер) тесты в Rails? – mikej

+0

Да, похоже на эти: http://api.rubyonrails.org/classes/ActionController/TestCase.html – 2tito

ответ

0

В течение теста контроллера вы можете переопределить один из методов на контроллере, как это:

def @controller.some_method 
    .. 
end 

так что вы можете окурок способа authenticate_with_open_id с использованием этой методики.

Теперь скажем, что вы хотите написать тест для сценария «для успешного входа в открытый идентификатор с непризнанным идентификационным URL-адресом создан новый пользователь», нам нужно заглушить 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' => '[email protected]le.org' } 
end 

Вам также потребуется using_open_id? вернуть true и вы можете сделать это либо гася или путем передачи требуемых параметров в запросе.

Затем вы можете утверждать, что дополнительный пользователь был добавлен в базу данных обычным способом.

+0

Спасибо за ваш ответ, но у меня есть сомнения. Я использую экземпляр @controller, но когда я попытался переопределить метод, как вы сказали, я получил «NoMethodError: protected method» authenticate_with_open_id ». Когда я вижу покрытие, он не входит в этот блок. Если это необходимо, я копирую код – 2tito

+0

У меня заканчиваются идеи. Есть ли способ имитировать ответ openid-провайдера и проверить внутри этого блока? – 2tito

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 
Смежные вопросы