1

В моей Dashboard#Index у меня есть это в мой контроллер:Как получить доступ к виртуальному атрибуту из драгоценного камня в Rspec?

tagged_nodes = Node.includes(:user_tags).tagged_with(current_user.email)  

Это моя спецификация:

it "assigns all the nodes that are tagged with the current_user email to local variable 'tagged_nodes'" do 
    get :index 
    expect(assigns(:tagged_users)).to eq Node.includes(:user_tags).tagged_with(@user.email)  
end 

Это ошибка я получаю:

Failure/Error: expect(assigns(:tagged_users)).to eq Node.includes(:user_tags).tagged_with(@user.email) 

     expected: #<ActiveRecord::Relation []> 
      got: nil 

     (compared using ==) 

Я подозреваю, что это из-за tagged_with, который является вспомогательным методом из драгоценного камня acts_as_taggable_on

Это то, что действительно вызывает эту ошибку? Если да, то как мне обойти это?

Если нет, что может быть причиной этой ошибки?

ответ

1

Вы пытались воспроизвести эту проблему за пределами из ваших тестов? Если нет, я думаю, что это первый логический шаг.

Я бы попытался воспроизвести эту проблему в самом контроллере (т. Е. В действии вашего контроллера, посыпать puts заявлениями или вставить binding.pry, если у вас есть превосходный жемчуг Pry). Если @tagged_users заселяется должным образом в действии контроллера при запуске сайта dev, но не заполняется при запуске спецификации с той же самой настройкой, то рассмотрите ее как проблему Rspec. Это сводится к «устранению как можно большего числа переменных, чтобы изолировать проблему».

+0

Да. Это нормально работает в моем контроллере. Что происходит, я добавляю тесты после факта. Поэтому контроллер работает прямо сейчас, с этой логикой, и я пытаюсь работать в обратном направлении. – marcamillion

+0

А у меня это получилось. В этом случае я бы рекомендовал драгоценный камень «pry». Добавьте его в свой gemfile ('test' и' development' groups), затем добавьте строку 'binding.pry' где-нибудь внутри вашего кода (в этом случае действие контроллера). Когда выполнение Ruby попадет в эту строку, оно остановится и предоставит вам интерактивную консоль, где вы можете запрашивать переменные, вносить изменения и т. Д., Чтобы определить, почему переменная не заполняется, как ожидалось. –

+0

Кстати, вы, вероятно, знаете TDD/BDD, оба из которых побуждают вас писать все спецификации * перед тем, как писать соответствующую реализацию; Я понимаю, что этот подход быстро устраняет эту проблему. К сожалению, я никогда не получал момент «ага» BDD и считал его мучительно утомительным, поэтому я часто бываю в той же лодке, что и вы. ;-) –