attr_accessor необходим для модульных тестов, но предотвращает запись полей в противном случае - PullRequest
0 голосов
/ 16 ноября 2011

До того, как я начал писать тесты, чтобы выяснить, что должны делать некоторые методы, моя модель содержала только предложения «принадлежат / есть» в верхней части файла.Все было хорошо.

Но когда я начал писать тесты, я продолжал получать «атрибут =», а не определенные ошибки.

Так что я, странно, думал, что геттеры и сеттеры былиреализовано по умолчанию.По-видимому, они не для модульного тестирования.поэтому я добавил attr_accessor :selected_end_index, :selected_start_index, :revision_number по одному, надеясь, что это просто проблема с одним атрибутом.Нет, это было со всеми из них.

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

Я создаю модель, выполняя Change.new (: revision_number => 3 и т. д.), но все эти поля в базе данных имеют нулевое значение.

Когда я удалил строку attr_accessor :selected_end_index, :selected_start_index, :revision_number из моей модели, все снова заработало (кроме тестов,конечно)

Что здесь происходит?Как мне сделать эти атрибуты доступными для моих модульных тестов и в среде разработчиков.

Я использую Ruby 1.8.7 и Rails 2.3.8.
Также использую стандартную среду модульных тестов (вместе с Factory Girl)

Обновление: добавление кода Это работает без attr_accessor, но только когда у меня есть attr_accessor:

change = Change.new(:kind => Change::CHANGE,
                    :status => Change::NEW,
                    :revision_number => latest_revision,
                    :content_id => params[:content_id],
                    :selected_text => selected_text,
                    :selected_start_index => selection_index_within_content_body,
                    :selected_end_index => selection_end_index_within_content_body,
                    :selection_hash => hash,
                    :suggested_text => params[:suggested_text],
                    :name_of_user => cookies[:login_name])

Когда вышеупомянутое сохраняется в БД, selected_start / end_indexи ревизия сохраняется без проблем, когда у меня нет attr_accessor.

@a = Factory(:change, :content_id => content[:id], 
                    :selected_start_index => 10,
                    :selected_end_index => 12)

Выше (из моего модульного теста) не работает без attr_accessor.он говорит, что selected_start_index = является неопределенным методом.но когда я добавляю строку attr_accessor.тест продолжается и в конце концов проходит успешно.

1 Ответ

1 голос
/ 16 ноября 2011

Вы можете расширить классы, которые хотите тестировать, внутри своего теста.

Пример:

class A
  def initialize(value)
    @a = value
  end
  def double
    @a = @a * 2
  end
end

Если вы хотите проверить внутренние значения, вам нужен читатель. Вы можете расширить А внутри своего теста:

require 'test/unit'

class A
  attr_reader :a
end

class Test_A < Test::Unit::TestCase
  def test_1
    a = A.new(1)
    assert_equal( 1, a.a )
    a.double
    assert_equal( 2, a.a )
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...