#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