1

次のオブジェクトと関係があります。

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

明らかに、質問モデルの状態は、テストとクラスの状態に結合されています。

単体テストを作成するとき、これをテストするには、この状態をすべてセットアップする必要がありますが、特にビジネス ケースがますます複雑になるにつれて、これは非常に扱いにくくなります。

どうすればこれを回避できますか?

4

1 に答える 1

2

私は 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

お役に立てれば。

于 2012-02-20T05:07:10.493 に答える