Модульное тестирование проверяет наличие нечетного поведения - PullRequest
2 голосов
/ 24 января 2012

Я пробую весь TDD, и у меня возникают проблемы с проверкой присутствия.У меня есть модель с именем Event, и я хочу убедиться, что при создании Event существуют title a price и summary.

Код модульного теста

class EventTest < ActiveSupport::TestCase

  test "should not save without a Title" do
    event = Event.new
    event.title = nil
    assert !event.save, "Save the Event without title"
  end

  test "should not save without a Price" do
    event = Event.new
    event.price = nil
    assert !event.save, "Saved the Event without a Price"
  end

  test "should not save without a Summary" do
    event = Event.new
    event.summary = nil
    assert !event.save, "Saved the Event without a Summary"
  end

end

Я запускаю тест, я получаю 3 FAILS.Что хорошо. Теперь я хочу, чтобы сначала был пройден тест title со следующим кодом в модели Event.

class Event < ActiveRecord::Base

  validates :title, :presence => true

end

При повторном запуске теста яполучите 3 ПРОХОДА , где я думаю, что я должен был получить 1 ПРОЙДЕН и 2 СБОЯ .Почему я получаю 3 пропуска?

Ответы [ 2 ]

2 голосов
/ 25 января 2012

У меня есть два вспомогательных метода тестирования, которые могут упростить диагностику такого рода вещей:

def assert_created(model)
  assert model, "Model was not defined"
  assert_equal [ ], model.errors.full_messages
  assert model.valid?, "Model failed to validate"
  assert !model.new_record?, "Model is still a new record"
end

def assert_errors_on(model, *attrs)
  found_attrs = [ ]

  model.errors.each do |attr, error|
    found_attrs << attr
  end

  assert_equal attrs.flatten.collect(&:to_s).sort, found_attrs.uniq.collect(&:to_s).sort
end

Вы бы использовали их в таких случаях:

test "should save with a Title, Price or Summary" do
  event = Event.create(
    :title => 'Sample Title',
    :price => 100,
    :summary => 'Sample summary...'
  )

  assert_created event
end

test "should not save without a Title, Price or Summary" do
  event = Event.create

  assert_errors_on event, :title, :price, :summary
end

Это должнопокажет, что вы пропустили проверку, которую вы ожидали, а также предоставит отзыв о конкретных проверках, которые не были выполнены, если они не ожидаются.

1 голос
/ 24 января 2012

Когда вы создали модель с Event.new, все атрибуты изначально имеют значение nil.Это означает, что все 3 атрибута, которые вы проверяете, уже равны нулю (поэтому event.title = nil и event.price = nil на самом деле ничего не делают).* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 100, * * * *).:

setup do
  @event_attributes = {:title => "A title", :price => 3.99, :summary => "A summary"}
end

Тогда вместо:

event = Event.new
event.title = nil

Используйте:

event = Event.new(@event_attributes.merge(:title => nil))

Сделайте то же самое для всех ваших тестов (заменив :title любым атрибутом, который выпроверяют наличие для)

Кроме того, нет причин вызывать save, чтобы проверить правильность состояния.Вы можете просто позвонить event.valid?, чтобы избежать поездок в базу данных, где она не нужна.

...