Factory.define :company do |f|
f.name “Foobar Inc.”
f.short_name “Foobar”
end
Factory.define :id_number do |f|
f.number “111111”
f.company {|c| c.association(:company)}
end[/code]
O ile nie mam problemu z powiązaniami pomiędzy użytkownika i firmą - logując użytkownika widzę, że ma firmę Foobar Inc. Problem jest z powiązaniem company z id_number. Domyślam się, że problemem jest to, że mam wiele id_numbers, a nie jak w przypadku usera jedną firmę.
Testowałem zarówno w RSpec jak i w Cucumber.
Odrazu mówie, że raczej jestem początkujący w BDD.
Przy okazji może polecicie jakieś projekty do obejrzenia gdzie jest zarówno RSpec jak i Cucumber, zazwyczaj jest jedno albo drugie (z kilkoma specami z scaffolda).
W fabryce company mógłbyś dodać obiekty id_numbers poprzez:
Factory.define :company do |f|
f.id_numbers { [Factory(:id_number), Factory(:id_number)] }
end
Tylko, że w tym przypadku w fabryce id_number trzeba się pozbyć powiązania z firmą, bo wpadniemy w pętlę.
Edit:
Albo też:
Factory.define :company do |f|
f.id_numbers { [Factory(:id_number, :company => nil), Factory(:id_number, :company => nil)] }
end
Przy okazji, definiując asocjację możesz to zrobić w badziej zwięzły sposób:
Factory.define :user do |f|
f.association :company
end
Dzięki… działa eh, że też wcześniej na to nie wpadłem.
Mam teraz pytanie… jak zmienić domyślne wartości, korzystając tylko z fabryki id_number, a więc:
Then /^my company have "(.+)" number$/ do |number|
id_number = Factory(:id_number, :number => number)
#tutaj powinno być powiązanie z current_user
#czyli id_number powinno nadpisać to co jest w factory
response.should contain(number)
end
I jak to powiązać z userem aktualnie zalogowanym. Bo mam to tak logowanie usera
Given /^I am logged in as "([^\"]*)" with password "([^\"]*)"$/ do |username, password|
user = Factory.create(:user, :username => username, :password => password)
visit login_url
fill_in "Username", :with => username
fill_in "Password", :with => password
click_button "Log in"
end
Tak, wiem, z początku tak miałem, tak dla testów to zmieniłem
Chyba będziesz musiał przekazać login usera w tym kroku ekspilicte, później wyszukać w bazie rekord i podstawić do fabryki.
Then /^company of user "(.+)" have "(.+)" number$/ do |login, number|
user = User.find_by_login login
id_number = Factory(:id_number, :number => number, :company => user.company)
end
Dużo ogórka jest w aplikacji Engine Yard - Rails Development Directory.
Źródło na githubie
[quote=morgoth]Chyba będziesz musiał przekazać login usera w tym kroku ekspilicte, później wyszukać w bazie rekord i podstawić do fabryki.
Then /^company of user "(.+)" have "(.+)" number$/ do |login, number|
user = User.find_by_login login
id_number = Factory(:id_number, :number => number, :company => user.company)
end
[/quote]
Myślałem o tym, choć wydawało mi się, że będę musiał tworzyć z fabryki i company i usera (co powodowało błąd - user już zajęty).
Jednak twój przykład nie działa. Nie zmienia danych. Próbowałem szukać po username/login jaki i wstawiać :company => current_user.company
Dzięki, rzeczywiście sporo.
Brakuje mi właśnie takiego dobrego przykładu RSpec i Cucumber. Trochę takiego przykładu było w prezentacji Bena Mabey. Jestem trochę pod tym względem zawiedziony na The RSpec Book, brak rozwinięcia tematu:
piszemy feature, cukes red
piszemy rspec jeden, rspec red
piszemy kod aplikacji, rspec green
piszemy rspec drugi (jak potrzeba), rspec red
piszemy kod aplikacji, rspec green, cukes green
Wiem, że mam wyjaśnione osobno RSpec i Cukes, ale na początek to trochę mało.
[quote=morgoth]Mógłbyś wkleić cały scenariusz?
Które dane mają się zmienić?[/quote]
W factories mam zdefiniowany id_number z number “111111”. Chciałbym, aby po
Then /^company of user "(.+)" have "(.+)" number$/ do |login, number|
user = User.find_by_login login
id_number = Factory(:id_number, :number => number, :company => user.company)
end
ten numer był zmieniony (oczywiście zakładając ze w scenariuszu podam np. "company of user “chris” have “222222” number)
Jednak po uruchomieniu test w widoku dostaje cały czas numer 111111
[quote=morgoth]A w którym miejscu masz ten krok?
Musisz go mieć przed ‘writualnym wyrenderowaniem’ strony, czyli przed krokiem typu:
“When I go to the company page”.[/quote]
Tak, masz racje to było to. Powiem, że nawet to logiczne… chciałem zmieniać zawartość widoku już po renderze…
Dzięki wielkie