2009-06-14 2 views
3

Я пытаюсь проверить, что поле генерируется должным образом с помощью обратного вызова, но я не могу понять это.Рельсы: Единичное тестирование a before_create?

album.rb

before_create :generate_permalink 

private 
    def generate_permalink 
    @title = album.downcase.gsub(/\W/, '_') 
    @artist = artist.downcase.gsub(/\W/, '_') 
    self.permalink = @artist + "-" + @title 
    end 

album_test.rb

test "should return a proper permalink" do 
    album = Album.new(:artist=>'Dead Weathers', :album=>'Primary Colours') 
    album.save 
    assert_equal "dead_weathers-primary_colours", album.permalink 
end 

Но это не работает, потому что album.permalink не будет возвращать значение, если она сохраняется.

Есть ли способ проверить before_create? Должен ли я делать это на уровне контроллера?

ответ

4

Я нашел this blog post что может заинтересовать.

Вкратце упоминается, что вы можете вызвать обратный вызов самостоятельно, используя метод отправки с обратным вызовом в качестве его параметра. В этом случае вы можете заставить альбом назвать before_create обратного вызова с помощью

album.send(:before_create) 
+0

спасибо, что работал с: album.send (: generate_permalink) с именем метода вместо: before_create – dMix

+2

К сожалению, забыл прочитать весь пост в блоге, и не было на моей домашней машине для тестирования. Да, это имя метода, который вы хотите назвать, а не обратного вызова. По-видимому, это хак для вызова частных методов. –

Смежные вопросы