Rails: создайте фикстуру для произвольных текстовых данных для использования в интеграционных тестах - PullRequest
1 голос
/ 18 июня 2011

Идея

Я создаю метод синтаксического анализа для объекта, чтобы я мог сделать это:

@address = Address.parse("123 Main St, San Francisco CA")

Я хочу создать библиотеку потенциальных пользовательских входных данных («поддерживаемые форматы» и т. Д.), Которые я могу использовать, чтобы убедиться, что сложные изменения регулярных выражений в одном месте не нарушают другие.

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

fixtures/address_inputs.rb

one:
  address: 123 Main St, San Francisco CA
two:
  address: 234 Center Road San Francisco, CA

Затем я могу перебрать все приборы для проверки полученных данных в объекте:

@addresses.each do |address|
  assert_true address.street_number.to_i > 0
end

или что-то подобное.

Проблема

Однако я не могу использовать fixtres, так как данные не связаны с таблицей ActiveRecord. Я получаю много ошибок, как это:

ActiveRecord::StatementInvalid: SQLite3::SQLException: no such table

Как мне создать тестовый прибор для произвольного ввода модульного теста? Должен ли я использовать другой инструмент для обработки этих интеграционных тестов?

1 Ответ

1 голос
/ 18 июня 2011

Эх ... Я бы сказал, что это плохая идея. Когда я смотрю на юнит-тест, я предпочитаю посмотреть, что он делает, поэтому, если у вас есть тест, который проверяет, правильно ли вытащен номер улицы, ваш тест может выглядеть следующим образом (это не зная, каково ваше намерение с функцией ):

@address = Address.parse("123 Main St, San Francisco CA")
assert_equal @address.street_number, "123"

Но если вы использовали «приспособление» (или некоторые данные, хранящиеся во внешнем файле), тест будет сложнее прочитать вам позже, а потом другому разработчику (обратите внимание, что я не использую приспособления) , Я предпочитаю factory_girl, поэтому я сделал синтаксис. Это, вероятно, неправильно, но смысл сделан):

@address = Address.parse(fixture(:address_one))
assert_equal @address.street_number, "123"

Почему вы утверждаете, что street_number равен "123"? Трудно понять, правильно ли написан тест, если проблема возникнет позже. Вы должны перейти к внешнему файлу, и это просто очень большая боль в заднице.

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

Factory.define :user do |f|
  f.sequence(:email){ |n| "testemail#{n}@example.net" }
  f.first_name "Test"
  f.last_name  "User"
end

Factory.define :admin_user, :parent => :user do |f|
  f.admin true
end

Таким образом, я всегда могу создать admin_user для теста, когда мне нужно, и если определение того, что делает пользователя администратором, меняется, проще сделать все тесты, которые полагаются на него, корректными. Однако это сделано не для проверки конкретного поведения атрибута @ user.admin, а для таких вещей, как разрешение, например «может ли пользователь получить доступ к этому действию?»

Если бы я позже использовал фабрику: user и хотел проверить специфическое поведение атрибута 'email', я бы не стал полагаться на то, что поставляла фабрика. Я бы создал объект следующим образом: переопределяя поле электронной почты по умолчанию:

@user = Factory.create(:user, :email => "myemail@example.net")

Чтобы сделать тест более понятным.

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

...