raylar

2013-02-09 20 views
5

açıkçası raylar için oldukça yeni 'yeni' yöntemine parametreleri geçirmek, böylece de benimlesin.raylar

benim modeli

class Movie < Media 
    attr_accessible :director, :studio 
    attr_accessor :director, :studio 

    validates_presence_of :director, :studio, :title 
    def initialize title, director, studio 
    @title = title 
    @director = director 
    @studio = studio 
    end 
end 

ve benim için berbat şeyler bu tür bir yapıcı ekledik. Ben bir yöntem yaşadım Befor bu

def new 
    @movies = Movie.new 
end 

gibi benim denetleyicisi ve initialize gelmeden önce o güzel çalıştı 'yeni'. 'Yeni' yönteme geçirilecek parametreler gerektirir, ancak bu bir görüşün bir kullanıcıdan argümanların iletilmesi ve kaydedilmesi için açıldıktan sonra yapıldı. Bir hatayı

wrong number of arguments (0 for 3) 

yapıcı eklendi olsun, çünkü Şimdi nedeniyle benim uygulama için bir test yazma ve o testi geçersiz olacak yapıcı için varsayılan degerler ayar başladı gerçeğine bu görünümü açamıyor. Bunu çözme önerisi?

DÜZENLEME: Benim testler şu şekilde görünür: ActiveModel tarafından sağlanan

tüm testler başarısız yapıcı olmadan
require 'spec_helper' 

describe Movie do 

    before :each do 
     @movie = Movie.new "Bullet", "John", "20th" 
    end 
    describe "#{new}" do 
     it "returns new object of Movie" do 
      @movie.should be_an_instance_of Movie 
     end 
     it "throws ArgumentError when give less than 3 parameters" do 
      lambda {Movie.new(:director => "John", :studio => "20th")}.should raise_exception ArgumentError 
     end 
    end 

    describe "#title" do 
     it "returns the correct title" do 
      @movie.title.should eql "Bullet" 
     end 
    end 
    describe "#director" do 
     it "returns the correct director" do 
      @movie.director.should eql "John" 
     end 
    end 
    describe "#studio" do 
     it "returns the correct studio" do 
      @movie.studio.should eql "20th" 
     end 
    end 
end 

....

+0

Öneri: sadece test için varsayılan değerler belirleyebilirler olarak ayarlayabilmek için yollar sağlar ve uygulama koduna bu kan ağlamaz test için bir fabrika kullanmak gerekiyorsa. Eğer başka nedenlerden dolayı bunu yapmak gerekirse, [bu soruya bakın] (http://stackoverflow.com/questions/328525/what-is-the-best-way-to-set-default-values-in-activerecord) – numbers1311407

+0

Testlerimde uygun argümanlar yapıyorum. Sorun değil. Test, bu problemin ortaya çıkması durumunda kurucuyu eklemek zorunda olan 3'den az argüman olup olmadığını kontrol ediyordu. –

+0

Ok, yeni öneri: Kod sayacı yaygın bunları düzeltmek için raylar bileşenleri kullanılan yazmaya zorlayan hiçbir neden çekirdek active_record duruma zarar testleri yazmayın. 'ActiveRecord :: Base # initialize' argümanların bir listesini değil, bir parametre nesnesini kabul eder. Eğer böyle bir birincil file parçası kırmakta ısrar ederseniz, bu sizin için birçok problemin ilki olacaktır. – numbers1311407

cevap

8

varsayılan yapıcı oldukça iyidir. Eğer (senin new eylem gibi) üç argüman sunmak istemiyorsanız

@movie = Movie.new(title: 'The Hobbit', director: 'Peter Jackson', studio: 'New Line Cinema') 

, sen sopa ile: Eğer yazdı yapıcı silerseniz, böyle varsayılan kurucusunu kullanmak mümkün olmalıdır @movie = Movie.new

+0

Ayrıca, bu tür bir şeyle daha iyi olmak için gerçekten iyi bir kaynak [Zombiler için Rails] (http://railsforzombies.org/) – graysonwright