Как использовать Следует для тестирования контроллера и создания нового AR в Rails? - PullRequest
0 голосов
/ 23 декабря 2010

Я новичок в использовании Следует и не знаю, с чего начать.

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

Как мне сделать это в Митте?

Вот что происходит, когда я создаю новую запись для электронной почты:

  def create
 29     @campaign = Campaign.find(params[:campaign_id])
 30     @email = @campaign.emails.build(params[:email])
 31     if @email.save
 32       @email.new_todos # create todos across all contacts for this asset
 33       flash[:notice] = "Successfully created email."
 34       #redirect_to campaign_url(@campaign)
 35       redirect_to :back
 36     else
 37       render :action => 'new'
 38     end
 39   end

'@email.new_todos "создает новые записи для модели Todo, которая является расширением, добавленным ко всем моделям, таким как Email:

  def create
 29     @campaign = Campaign.find(params[:campaign_id])
 30     @email = @campaign.emails.build(params[:email])
 31     if @email.save
 32       @email.new_todos # create todos across all contacts for this asset
 33       flash[:notice] = "Successfully created email."
 34       #redirect_to campaign_url(@campaign)
 35       redirect_to :back
 36     else
 37       render :action => 'new'
 38     end
 39   end

Я хотел бы постепенно начать включать тесты и выбираю ключевые типы поведения, которые, как представляется, могут сломаться, чтобы узнать, как это сделать.

Спасибо.

1 Ответ

1 голос
/ 23 декабря 2010

Этот пример лучше подходит для юнит-теста.Хотя вы запускаете действие в контроллере, логика в модели.

Следует добавить удобные функции в Test::Unit.Такие вещи, как контексты и сопоставления.

Я бы проверил это так:

context '.new_todos' do
  setup do
    @campaign = Campaign.create(:name => 'My Campaign')
    @email = @campaign.emails.build(:subject => 'Test Campaign Email')
    @email.save
    @email.new_todos
  end

  should 'generate todos for all contacts' do
    assert @email.todos.count > 0
  end
end

Очевидно, что атрибуты образца должны были бы измениться, и вы захотите убедиться, что вы получаете желаемоерезультат (я догадался и использовал @email.todos), но это только начало.Я буду рад обновить, если вы сможете попробовать это и посмотреть, что произойдет.

Чтобы проверить это в контроллере, вам понадобится функциональный или интеграционный тест.Функциональные тесты тоже довольно просты с musta.Это будет выглядеть примерно так:

context 'POST to :create' do
  setup do
    @campaign = Campaign.create(:name => 'My Campaign')
    @email = 'test@test.com' # or whatever data you're expecting
    post :create, :campaign_id => @campaign.id, :email => @email
  end

  should respond_with(:redirect)
  should redirect_to('/some/path')
end

Это начало.Удачи!

...