Cucumber, rspec, factory_girl i powiązanie modeli

Witam po przerwie,
mam problem z factory_girl i testami. Mam modele:

  • user, belongs_to :company
  • company, :has_many :users i :id_numbers
  • id_number, belongs_to: company

Mam takie factories:

[code=ruby]Factory.define :user do |f|
f.sequence(:username) { |n| “foo#{n}” }
f.password “foobar”
f.password_confirmation {|u| u.password}
f.sequence(:email) { |n| “foo#{n}@example.com” }
f.company {|c| c.association(:company)}
end

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).

pozdrawiam

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 :slight_smile: 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

pozdrawiam

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.

Dzięki i pozdrawiam

Tu jest trochę przykładów:

http://github.com/jschoolcraft/urlagg

Mógłbyś wkleić cały scenariusz?
Które dane mają się zmienić?

[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

pozdrawiam

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=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