Zaskoczyłem ten problem podczas testowania. Załóżmy, że mam dwa modele, User i Post, gdzie użytkownik has_many: posty.Wyśmiewanie powiązania ActiveRecord w testach RSpec
Próbuję spec się blok kodu, który zawiera coś takiego:
user = User.find(123)
post = user.posts.find(456)
wiem jak wyśmiewać się z User.find
i user.posts
części. Mock user.posts
zwraca tablicę obiektów Post. A gdy dojdzie do części .find(456)
, wszystko zepsuje się z wyjątkiem no block given
.
Moje pytanie brzmi: co mam zwrócić w wyniku próbkowania user.posts
, dzięki czemu działa na nim metoda .find(456)
? User.first.posts.class
mówi, że to Array, ale oczywiście jest coś, co sprawia, że wywołania AR-style działają. Nie jestem zachwycony perspektywą wyszydzania metody znalezienia na zwróconym obiekcie.
PS Zanim zasugerujesz oczywistą i dobrą odpowiedź na temat przestoju, wyśmiewania się i używania urządzeń/zasiewania testowej bazy danych z niezbędnymi danymi, oto haczyk: starszy schemat. Zarówno użytkownik, jak i post pracują nad widokami bazy danych, a nie tabelami, i zmieniając je tak, aby były tabelami w testowej bazie danych, wydają mi się błędne.
To jest „brzydki” sposób, że nie chciał zrobić, ale twoja wzmianka o „obiektu proxy stowarzyszenia” dostarczyła mi słów kluczowych, których mi brakowało, a poszukiwanie go doprowadziło do tego, czego szukałem, dzięki! –
@Tomy, jeśli twoje rozwiązanie jest unikalne wśród tych odpowiedzi, może możesz dodać je jako inną odpowiedź. Chciałbym zobaczyć, jak to rozwiązałeś. –
Brzydki sposób, drwi z mocks. Po prostu ucieszyłem się z tego - nie pierwszy raz spotkałem się z tą sytuacją i to mnie martwiło. –