Предотвращение государственного соединения? - PullRequest
1 голос
/ 16 февраля 2012

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

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

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

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

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

1 Ответ

2 голосов
/ 20 февраля 2012

Я не разбираюсь в ассоциациях 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

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

...