Rails и RSpec: возврат коллекции макетов ассоциаций

#ruby-on-rails #rspec

#ruby-on-rails #rspec

Вопрос:

У меня есть некоторый код, который использует find_or_initialize_by через ассоциацию:

 author.posts.find_or_intialize_by(params)
  

Для целей некоторых тестов я хотел бы иметь контроль над тем, что возвращается. Однако, похоже, я не могу понять, над чем издеваться.

 author.posts.class #=> Post::ActiveRecord_Associations_CollectionProxy

allow(Post::ActiveRecord_Associations_CollectionProxy).to receive(:find_or_initialize_by).and_return(Post.new)
  

Это вызывает ошибку:

 Post::ActiveRecord_Associations_CollectionProxy does not implement: find_or_initialize_by
  

Я понимаю, что мог бы изменить свой запрос на что-то вроде:

 Post.find_or_initialize_by({author: author}.merge(params))
  

Для большей ясности я бы хотел сделать это через ассоциацию.

Как я могу издеваться над этой коллекцией, чтобы вернуть мою запись?

Комментарии:

1. подождите — почему вы пытаетесь вернуть автора в коллекцию сообщений

2. @TarynEast извините, опечатка при обработке моего кода для примера. Я обновил его.

3. kewl — это заставило меня подумать, что я совершенно неправильно понял проблему: D

Ответ №1:

Вы пробовали:

 let(:author) { Author.new } # or whatever you'd like author to be)

it "is the name of your actual test here" do
  allow(author.posts).to receive(:find_or_initialize_by).and_return(Post.new)
end
  

Комментарии:

1. :facepalm: Так просто, это блестяще. И это более точно. Спасибо, @TarynEast.

2. хехе — у меня была такая же реакция, когда я впервые узнал об этом: D