2012-05-14 11 views
16

mam następujące modele:Jak skonfigurować urządzenia dla relacji has_and_belongs_to_many?

class Company < ActiveRecord::Base 
    has_and_belongs_to_many :regions 

class Region < ActiveRecord::Base 
    has_many :requests 
    has_and_belongs_to_many :companies 

class RequestForProposals < ActiveRecord::Base 
    belongs_to :region 

Ilekroć dostać nowy wniosek, chcę wysłać zgłoszenie do firm działających w tym samym regionie.

Jak ustawić to w moich urządzeniach, aby móc przetestować logikę znajdowania właściwych firm?

Próbowałem

region_ids: 1, 2 
regions: one, two 

w companies.yml, ale nie działa w przypisaniu regionom spółek.

Oto sedno SQL generowane: https://gist.github.com/2713518

Odpowiedz

28

Dla

regions: one, two 

w companies.yml pracować trzeba pozwolić szyny auto przypisać identyfikatory dla regionów. Dzieje się tak dlatego, że (aby uniknąć konieczności czytania pliku regions.yml przed company.yml), railsy obliczają identyfikatory, które umieszcza w tabeli sprzężenia od nazw urządzeń firm. jeśli sam przypisałeś identyfikatory, nie będą one odpowiadały obliczonym.

Z sql już dostarczonych wygląda na to, że masz ustawione identyfikatory w regionach 1 i 2, to znaczy swoją regions.yml ma

one: 
    id: 1 
    name: MyString 

Zdjąć id:1 i powinno być OK. Trzeba także aktualizować żadnych innych plików (np request_for_proposals.yml), które odnoszą się do regionów, zastępując

region_id: 1 

z

region: one 

Rails będzie wiedział, co oznacza, że ​​aby ustawić region_id do ID państwa dla region z etykietą one w swoich urządzeniach.

0

jestem pewien, w jaki sposób jednokrotnym użyciu urządzeń YAML te dni. Czy próbowałeś utworzyć instancję obiektu db podczas testowania? Działa to prawie tak samo, jak mecze, jednak w bardzo wyrafinowany sposób.

Następujące fragmenty zakładają, że używasz rspec jako szkielet testowy.

Po tym factory_girl-rails w swoim Gemfile i aktualizowanie spec/spec_helper.rb odpowiednio do factory_girl s README, tworzyć następujące pliki:

# spec/factories/company_factories.rb 
FactoryGirl.define do 
    factory :company do 
    title { |n| "Test Company #{n}" } 

    # whatever else fields 

    after_create { |company| company.regions << FactoryGirl.create(:region) } 
    end 
end 

# spec/factories/region_factories.rb 
FactoryGirl.define do 
    factory :region do 
    # whatever fields here 
    end 
end 

# spec/factories/request_factories.rb 
FactoryGirl.define do 
    factory :request do   
    # whatever fields here 
    end 
end 

Teraz pytanie brzmi - jaka jest rzeczywista kodu testu robisz?

0

Czy Twój region.yml znajduje się w katalogu test/fixtures? A co z firm.yml? Twój kod "regiony: jeden, dwa" dla danej firmy powinien działać.
Szyny automatycznie ładują urządzenia w tym katalogu po uruchomieniu testu. Jeśli lokalizacje są poprawne, po uruchomieniu testów opublikuj wyniki testu - wygenerowane przez sql.

+0

Oto sedno SQL generowane: https: //gist.github .com/2713518 –

+0

A tak, pliki urządzeń znajdują się w katalogu test/fixtures –

-1

Oprócz akceptowanej odpowiedzi, jeśli musisz samodzielnie obliczyć taki identyfikator, np. masz jakieś luźne odniesienia lub innego źródła danych tylko dodać:

def fixh(key) 
    ActiveRecord::FixtureSet.identify key 
end 

do test_helper.rb a następnie wykorzystać tę drogę w opraw:

security_context1: 
    ext_id: <%= fixh :user1 %> 
Powiązane problemy