Модульное тестирование с помощью Rails светильников - PullRequest
2 голосов
/ 20 сентября 2011

Извините за смутное название вопроса, но я с трудом пытаюсь перевести то, что я спрашиваю, в одну строку ...

У меня есть пара простых моделей Rails (3.1), сгенерированных с помощью rails g scaffold, которые я пытаюсь выполнить модульное тестирование. Они определены следующим образом:

class ModelA < ActiveRecord::Base
  validates_presence_of :field1, :field2
  validates_uniqueness_of :field1
end

class ModelB < ActiveRecord::Base
  validates_presence_of :field1
  validates_uniqueness_of :field1
end

У меня есть пара светильников для каждой модели, то есть:

model_a_no_field1:
    field2: test

model_a_no_field2:
    field1: test

model_a_ok:
    field1: test
    field2: test

и

model_b_no_field1:

model_b_ok:
    field1: test

Мои модульные тесты проверяют эти проверки:

class ModelATest < ActiveSupport::TestCase
  test "field1 should be present" do
    assert !model_as(:model_a_no_field1).valid?
  end

  test "field2 should be present" do
    assert !model_as(:model_a_no_field2).valid?
  end

  test "field1 should be unique" do
    model_a = model_as(:model_a_ok)
    model_a.save

    assert !model_as(:model_a_ok).valid?
  end
end

Все эти тесты пройдены правильно. Тем не менее, мои подобные юнит-тесты для ModelB:

class ModelBTest < ActiveSupport::TestCase
  test "field1 should be present" do 
    assert !model_bs(:model_b_no_field1).valid?
  end

  test "field1 should be unique" do 
    model_b = model_bs(:model_b_ok)
    model_b.save

    assert !model_bs(:model_b_ok).valid?
  end
end

Ошибка второго теста (проверка уникальности).

Я почти уверен, что это связано с пустым устройством YAML для model_b_no_field1, но я не уверен. Я могу заставить тест пройти, заменив тело метода теста на

test "field1 should be unique" do
  model_b = model_bs(:model_b_ok)
  model_b.save

  model_b2 = ModelB.new

  assert !model_b2.valid?
end

Это нормально, но я бы хотел понять, что здесь происходит.

1 Ответ

3 голосов
/ 21 сентября 2011

Я думаю, вы подрываете тестовую инфраструктуру, которую создает для вас rails.Модели, которые есть в файле yaml, должны быть действительными, и если вы хотите протестировать что-то недопустимое, создайте его в тесте.

Создание данных в тесте имеет дополнительную ценность:и бетон.В противном случае разработчик должен открыть файл yaml, чтобы понять, какие данные у вас есть, а какие отсутствуют.

...