我在django中有一个模型,它有一个外键到另一个模型,在单元测试期间,我想避免两个模型的紧耦合,并为另一个模型创建一个存根,每次返回不同的值。 / p>
受挫的例子:
class Moon(models.Model):
def phase(self):
# some extremely complex code
class Wolf(models.Model):
moon = models.ForeignKey(Moon)
mood = models.CharField()
def update_mood(self):
if (self.moon.phase == 'new moon'):
self.mood = "good"
if (self.moon.phase == 'waxing crescent'):
self.mood = "hopefull"
...
上述示例:
w = Wolf()
m = Moon()
# m.phase = 'new moon'
w.moon = m
w.update_mood()
w.mood # 'good'
现在我想在执行update_mood()调用后测试Wolf()。moon属性,而根本没有触及Moon模型 - 因为它是一个非常复杂的模型,可以进入各种外部系统走出阶段。
通常我会使用猴子修补,但是因为.mood是一个属性...我无法用猴子修补方式分配它。
帮助。
答案 0 :(得分:2)
通过一些挖掘,偶然发现了模型add_to_class()方法,该方法执行正确的猴子修补并可以覆盖模型上的外键属性。
使用示例:
class FakeMoon(object):
def get_phase(self): return self._phase
def set_phase(self, phase): self._phase = phase
phase = property(get_phase, set_phase)
# this bit is the answer to the question above
Wolf.add_to_class("moon", FakeMoon())
w = Wolf()
w.moon.phase = 'new moon'
w.update_mood()
assert w.mood == 'good'
w.moon.phase = 'waxing crescent'
w.update_mood()
assert w.mood == 'hopefull'
答案 1 :(得分:0)
为了测试,您可以覆盖(猴子补丁,如果您只想在测试环境中使用它)__ getattribute__。
在__ getattribute__中检查属性moon是否被调用,返回值或在临时var中设置值。