Возникли проблемы с модульным тестом в Rails (новичок). Странное и неожиданное поведение - PullRequest
0 голосов
/ 22 января 2012

Итак, я новичок в тестировании в Rails, и у меня возникают проблемы с пониманием того, почему этот модульный тест не проходит.По сути, я ожидаю, что этот модульный тест введет одну запись в тестовую базу данных.По какой-то странной причине тест не пройден, и все же две записи добавляются в тестовую базу данных.Это очень странное поведение.Используя 'rails c test' и затем набирая 'Thing.all', это то, что я получаю до запуска теста и после запуска теста.

до теста (после запуска rake db: test:подготовить и затем Thing.all в консоли рельсов):

Thing Load (0.5ms)  SELECT "things".* FROM "things" 
 => [] 

После теста:

Thing Load (0.6ms)  SELECT "things".* FROM "things" 
 => [#<Thing id: 980190962, name: "MyNameAgain", created_at: "2012-01-22 17:34:25", updated_at: 
"2012-01-22 17:34:25", description: "MyDescription">, #<Thing id: 298486374, name: "Hello", 
created_at: "2012-01-22 17:34:25", updated_at: "2012-01-22 17:34:25", description: 
"HelloDescription">] 

Итак, вот модульный тест:

require 'test_helper'
require 'awesome_print'

class ThingTest < ActiveSupport::TestCase

  setup do
    @example = Thing.new(things(:one).attributes)
    # Must set id manually
    @example.id = things(:one).id
  end

  test 'thing can be created' do
    ap @example
    ap @example.valid?
    ap @example.errors
    assert @example.save
  end

end

Вывод из удивительной печати выглядит следующим образом:

#<Thing:0x007fda8c1d99f8> {
             :id => 980190962,
           :name => "MyNameAgain",
     :created_at => Sun, 22 Jan 2012 17:17:08 UTC +00:00,
     :updated_at => Sun, 22 Jan 2012 17:17:08 UTC +00:00,
    :description => "MyDescription"
}
false
#<ActiveModel::Errors:0x7fda8c064000
    @base = #<Thing:0x007fda8c1d99f8> {
                 :id => 980190962,
               :name => "MyNameAgain",
         :created_at => Sun, 22 Jan 2012 17:17:08 UTC +00:00,
         :updated_at => Sun, 22 Jan 2012 17:17:08 UTC +00:00,
        :description => "MyDescription"
    },
    attr_reader :messages = {
        :name => [
            [0] "has already been taken"
        ]
    }
>
F
Finished in 0.186603 seconds.

  1) Failure:
test_thing_can_be_created(ThingTest) [/Users/sb1752/Dropbox/Coding/GeneralAssembly/class_RubyForDevs/4-rails-mvc/4.3-rails-dev/test/unit/thing_test.rb:16]:
Failed assertion, no message given.

1 tests, 1 assertions, 1 failures, 0 errors, 0 skips

Вот приспособление:

one:
    name: MyNameAgain
    description: MyDescription

two:
    name: Hello
    description: HelloDescription

Вот модель:

class Thing < ActiveRecord::Base
  validates :name, :uniqueness => true, :presence => true
end

Дайте мне знать, еслиВам нужно больше информации!Спасибо!

1 Ответ

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

Исходя из того, как вы формулируете свой вопрос, я предполагаю, что вы не до конца понимаете, как работают приборы. Файлы фикстуры (в вашем случае - "things.yml"), используются для загрузки объектов в базу данных , которые будут доступны в качестве образца данных во время каждого теста. Когда вы запускаете Thing.all, вы видите модели, созданные для вас в файлах фикстур.

Также нет причин (вероятно), чтобы вы назначали: id для своих моделей во время теста. Как правило, rails создает поле базы данных с автоинкрементом и обрабатывает установку идентификатора для вас при сохранении элемента. (В исключительных случаях требуется указать идентификатор, но это не норма.)

Чтобы вернуться к вашей проблеме, вот сообщение об ошибке, приводящее к обнаруженной вами ошибке:

    :name => [
        [0] "has already been taken"
    ]

Это потому, что ваше требование проверки validates :name, :uniqueness => true проверяет, что имя уникально (не используется более чем одной записью), и не позволит вам повторно использовать существующее: name - в этом случае одно из устройств является уже использую его (тот, чьи атрибуты вы копируете). Вам нужно либо изменить свой тест (изменить имя новой модели, которую вы хотите создать), либо изменить правила проверки.

Еще один вариант тестирования, который вы, возможно, захотите рассмотреть, - это использование фабрики (например, FactoryGirl), а не приборов для создания тестовых моделей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...