2012-05-11 4 views
6

Ich versuche, eine "Post create" Aktion mit Rspec zu testen. Der Code lautet wie folgt:Testen "Post create" mit Rspec

def valid_attributes 
    { 
    :zone => Flymgr::Zone.new(:countries => Flymgr::ZoneCountry.first, 
     :name => 'USA', 
     :description => 'USA Flight', 
     :zipcodes => ''), 
    :price => '100.00', 
    :class => 'first', 

    } 
    end 

    def valid_session 
    {} 
    end 

    before(:each) do 
     @request.env["devise.mapping"] = Devise.mappings[:admin] 
     admin = FactoryGirl.create(:admin) 
     sign_in admin       
     end 

describe "POST create" do 
    describe "with valid params" do 
     it "creates a new Flymgr::Rule" do 
     expect { 
      post :create, {:Flymgr_rule => valid_attributes} 
     }.to change(Flymgr::Rule, :count).by(1) 
     end 

Einer der erforderlichen Attribute für das Formular ist eine ‚Zone‘, das ist eine Drop-Down-Box und die Optionen für den Drop-Down mit einer anderen Form erstellt. Ich weiß nicht, wie man mit Rspec einen Formulareintrag erstellt. Wie Sie sehen können, habe ich versucht, eine Methode von einem anderen Controller Flymgr::Zone.new aufzurufen. Ich glaube nicht, dass das funktioniert und es bricht meinen Test.

Kann jemand über den besten Weg beraten, dies zu tun? Vielleicht sollte ich FactoryGirl verwenden, um einen Zonen- und Regeleintrag zu erstellen?

Antwort

5

Ihre Anfrage Parameter Hash hat ein Objekt als Wert: Zone, wenn Sie es veröffentlichen wird nur ‚to_s'-ed sein, was unwahrscheinlich ist, was Sie wollen.

Im Allgemeinen ist die beste Praxis ist ab Werk Mädchen zu verwenden, um Ihre Objekte zu bauen und die attributes_for Strategie verwenden, um seine Attribute für die Post-Anforderung zu parametrieren: What is the proper way to test 'create' controller actions?

Ihre Frage ist darauf hindeutet, dass der Verein eine BELONG_TO so Sie ist muss nur eine ID posten. Beachten Sie, dass FactoryGirl zur Zeit keine Attribute für die Assoziationen erstellt. Wenn Ihre Fabrik Definition für Regelpflege der Zone Verband nimmt, können Sie diese Abhilfe verwenden:

FactoryGirl.build(:flymgr_rule).attributes 

zu auch einen zone_id aber, dann müssen Sie die unerwünschten params auszuschließen. ("id", "erstellt_at", "aktualisiert_at", usw.).

So können Sie besser dran explizit dem params-Hash-Informationen für die Zone einfügen sein, wie Sie es in einer gültigen Post-Anforderung zu sehen.

Lesen Sie diesen Thread auf factory Attribute und Assoziationen: https://github.com/thoughtbot/factory_girl/issues/359

3

Als guide betont:

# Returns a hash of attributes that can be used to build a User instance 
attrs = FactoryGirl.attributes_for(:user)