我有以下对象和关系,
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
很明显,问题模型的状态现在与测试和类的状态相关联。
在创建单元测试时,为了测试这一点,我需要设置所有这种状态,这非常难以处理,尤其是在业务案例变得越来越复杂时。
我该如何避免这种情况?
答案 0 :(得分: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
希望这有帮助。