2013-02-26 6 views
9

Mam następujący rspec test, który działa:Jak wysłać parametry za pomocą FactoryGirl (w przeciwieństwie do ręcznego wysyłania parametrów jako skrótu)?

it "redirects to the created api_key" do 
    post :create, :api_key => {:api_identifier => "asdfadsf", :verification_code => 
     "12345"} 
    response.should redirect_to(ApiKey.last) #(or any other test function) 
    end 

Ale używam dziewczynę fabryce, więc nie trzeba ręcznie tworzyć api_key s.

Jak mogę zreplikować powyższą funkcję, ale użyć dziewczyny z fabryki?

Zastosowanie:

it "redirects to the created api_key" do 
    test = FactoryGirl.build(:api_key) 
    post :create, :api_key => test 
    response.should redirect_to(ApiKey.last) #(or any other test function) 
    end 

czyli

it "redirects to the created api_key" do 
    post :create, FactoryGirl.build(:api_key) 
    response.should redirect_to(ApiKey.last) #(or any other test function) 
    end 

Daje mi wartości NULL dla wartości :api_key po przyjeździe w moim kontrolera.

Dla porównania, tutaj jest mój utworzyć działanie, że ten test jest testowanie:

def create 
    @api_key = ApiKey.new(params[:api_key]) 
    @api_key.user = current_user 
    pp @api_key 

    respond_to do |format| 
    if @api_key.save 
     format.html { redirect_to @api_key, notice: 'Api key was successfully created.' } 
     format.json { render json: @api_key, status: :created, location: @api_key } 
    else 
     format.html { render action: "new" } 
     format.json { render json: @api_key.errors, status: :unprocessable_entity } 
    end 
    end 
end 

Odpowiedz

25

try:

post :create, :api_key => FactoryGirl.attributes_for(:api_key) 
+0

Zrobiłeś mój dzień! Wielkie dzięki !! – Hito

1

Korzystanie build faktycznie nie utworzyć rekord. Po prostu udaje, że tak. Korzystanie z attributes_for da ci atrybuty obiektu. Jest to najczęściej używane w kontekście, który opisujesz. Zauważ, że ten zbyt nie utworzy obiektu.

Co chciałbym zrobić to, jeśli odpowiedź jest udany/przekierowanie:

response.should be_redirect 

Albo jeszcze lepiej wykorzystać expect.