Предотвращение сопряжения состояний?

У меня есть следующие объекты и отношения,

Lecture >- Tests
Test >- Questions

Бизнес правила

When the lecture is started, a test can be given
If a test is being given, questions can be asked

Вывод

Therefore questions shouldn't be asked if the lecture hasn't been started.

Модель вопроса

class Question
  belongs_to :test
  belongs_to :lecture, :through => :test

  def ask_question
    raise "Test not started!" unless test.started?
    raise "Lecture not started!" unless lecture.started?
  end
end

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

При создании модульных тестов, чтобы проверить это, мне нужно настроить все это состояние, что становится довольно громоздким, особенно по мере того, как бизнес-кейсы становятся все более и более сложными.

Как я могу этого избежать?


person Allyl Isocyanate    schedule 16.02.2012    source источник


Ответы (1)


Я не знаком с ассоциациями Ruby, но мне кажется, что здесь каким-то образом модель данных смешивается с логикой времени выполнения.

Если бы я создал модель данных для вопросов и тестов, я бы хотел повторно использовать свои вопросы в тестах, а также повторно использовать подготовленные тесты (наборы вопросов) в лекциях. В этом случае я бы написал что-то вроде

class Lecture
  has_and_belongs_to_many :tests
end

class Test
  has_and_belongs_to_many :lectures
  has_and_belongs_to_many :questions
end

class Question
  has_and_belongs_to_many :tests
end

Отдельно от этой структуры у меня была бы структура, соответствующая лекциям в реальном времени, тестам, вопросам и понятию результата. Результатом является попытка ответить на вопрос данного студента в режиме реального времени.

Я бы также «делегировал» проверку состояния сеанса лекции тестовому сеансу. Если тестовая сессия не может быть запущена по какой-либо причине, сессия вопросов также не может быть запущена.

Для модульного тестирования сеанса вопросов вам нужно будет только имитировать тестовый сеанс, для модульного тестирования тестового сеанса вам нужно будет имитировать сеанс лекции и так далее.

class Lecture_Session
  has_many :tests_sessions
  belongs_to :lecture
end

class Test_Session
  belongs_to :lecture_session
  belongs_to :test
  has_many :question_sessions

  def validate
    raise "Lecture not started!" unless lecture_session.started?
  end
end

class Question_Session
  belongs_to :question
  belongs_to :test_session

  def validate
    raise "Test not started!" unless test_session.started?
  end
end

class Result
  belongs_to :lecture_session
  belongs_to :test_session
  belongs_to :question_session
  belongs_to :student

  def validate
    raise "Question is not active!" unless question_session.active?
  end
end

Надеюсь это поможет.

person Max Galkin    schedule 20.02.2012