2011-08-12 23 views
5

Jestem całkiem nowy w testowaniu i szynach i próbowałem sam to rozgryźć, ale bez powodzenia.Testowanie zagnieżdżonych atrybutów rspec z rspec

mam następujące modele

class Picture < ActiveRecord::Base 
    belongs_to :product 
    has_attached_file :image 
end 

class Product < ActiveRecord::Base 
    has_many :pictures, :dependent => :destroy 
    accepts_nested_attributes_for :pictures, :reject_if => lambda { |p| p[:image].blank? }, :allow_destroy => true 
end 

oraz sterownik, który jest dość standardowy, myślę ...

def create 
    @product = Product.new(params[:product]) 
    if @product.save 
    redirect_to products_path, :notice => "blah." 
    else 
    render :action => "new" 
    end 
end 

jak bym go o to i przetestować? Próbowałem coś takiego ale nie mogę zmusić go do pracy:

describe ProductsController do 
    it "adds given pictures to the product" do 
    product = Factory.build(:product) 
    product.pictures.build(Factory.attributes_for(:picture)) 
    post :create, :product => product.attributes 
    Product.where(:name => product[:name]).first.pictures.count.should == 1 # or something 
    end 
end 

To chyba ma coś wspólnego ze sposobem, atrybuty są przekazywane do działania stworzenia, ale w jaki sposób można uzyskać to do pracy? Używam rails 3.1.rc5, ale wątpię, że ma to coś wspólnego z tym, dlaczego nie działa ...

czy nie przetestowałbyś tego w ogóle, skoro jest to podstawowa funkcja szyn i najprawdopodobniej dobrze przetestowana na początek?

Odpowiedz

5

Tak jak mówisz, nie musisz tego koniecznie testować, ponieważ będzie on objęty podstawową funkcjonalnością railsów, a takie rzeczy powinny być dokładnie omówione w testach integracyjnych.

Jeśli jednak chcesz przetestować to, najlepszym sposobem jest podpięcie dzienników programowania i sprawdzenie, co jest publikowane w działaniu, skopiowanie i wklejenie go do testu, a następnie zmodyfikowanie w celu dopasowania do Twoich potrzeb.

Użycie atrybutów lub atrybutów factory_girl nie spowoduje ich niestety.

+0

nie zgadzam się z tym. Nie będziesz przechwytywał regresji, jeśli nie przetestujesz i nie masz żadnych specyfikacji ani dokumentacji. – phikes

+0

@phikes Widziałeś część, w której powiedziałem przetestować ją za pomocą testów integracyjnych? – jonnii

5

Spróbuj:

post :create, :product => Factory.attributes_for(:product, :pictures => [ Factory.build(:picture) ])