2015-02-13 5 views
4

У меня есть эти модели:Почему мой Rails Minitest Polymorphic Fail?

class User < ActiveRecord::Base 
    has_one :setting, as: :resource, dependent: :destroy 
    has_many :services 
end 

class Setting < ActiveRecord::Base 
    belongs_to :resource, polymorphic: true 
end 

class Service < ActiveRecord::Base 
    belongs_to :user 
end 

и у меня есть этот фрагмент кода от контроллера доступа к ним, который работает при тестировании вручную (это метод before_action):

before_action :setup 

def get_vars 
    @setting = Setting.find_by_booking_url @url 
    @user = @setting.resource 
    @services = @user.services 
end 

def setup 
    @url = params[:url] 
    @setting = Setting.find_by_url @url 
    @user = @setting.resource 
end 

, но при использовании автоматизированное тестирование этих приборов:

# fixtures/users.yml 
james: 
    email: '[email protected]' 
    first_name: 'James' 
    last_name: 'Soften' 
    encrypted_password: <%= default_password_digest %> 

# fixtures/settings.yml 
scott_settings: 
    resource: james (User) 
    time_zone: 'Pacific Time (US & Canada)' 
    url: 'urlsegment' 

и этот тест контроллера код:

setup do 
    @user = users(:james) 
end 
def test_booking_page_success 
    get :new, url: @user.setting.url 
    assert_response :success 
end 

он терпит неудачу с ошибкой:

undefined method `services` for nil:NilClass 

, который указывает на то, что я не могу получить доступ к «ресурс», чтобы получить пользователя от объекта настройки.

Я проверил переменные, используя byebug (в середине прогона тестов), а объект Setting (@ user.setting) имеет имя resource_id и resource_name, поэтому мне было интересно, почему я не могу получить доступ к пользователю из объекта Setting, используя " ресурс "при запуске тестов.

Любые идеи?

Спасибо!

EDIT: добавлена ​​еще контроллер кода

EDIT: добавлено поле URL в настройках фиксатора

+0

Это только я или возможно, что '@user = @ setting.resource' не имеет смысла? в методе get vars. Это может не сработать при ручном тестировании по разным причинам? – christoshrousis

+0

Можете ли вы обновить часть вашего контроллера, которая задает переменную экземпляра '' @ url''? –

+0

обновление предоставлено – yretuta

ответ

1

Попробуйте следующее перед test_booking_page_success

def test_url 
assert_not_empty @user.setting.url 
end 

Вы, вероятно, передавая пустой «URL '... если показанные приборы завершены, и вы не генерируете url из чего-то другого.

Обновление Единственный сценарий, который я могу себе представить: это то, что booking_url в scott_settings задано чем-то другим, кроме «urlsegment» в ваших светильниках. Таким образом, он возвращает другие настройки с помощью ресурса nil ...

+0

добавил этот тест. он прошел – yretuta

+0

хм, странно, создал тестовую настройку со структурой вашего приложения, но не могу заставить ее терпеть неудачу ... какая версия рельсов вы используете? (Я сделал это на 4.2.0) –

+0

Проведено некоторое исследование ... ничего, просто подтвердите, что этот код работает, как при автоматическом, так и ручном тестировании. Единственное, что я не могу проверить, это '@setting = Setting.find_by_booking_url @ url', но если вы проверили с помощью byebug ... –

Смежные вопросы