1

我在 django 中有一个模型,该模型具有另一个模型的外键,在单元测试期间,我想避免两个模型的紧密耦合,并为另一个模型创建一个存根,该存根每次都会返回不同的值。

人为的例子:

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 是一个属性......我不能真正以猴子补丁的方式分配给它。

帮助。

4

2 回答 2

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'
于 2011-04-06T13:50:18.827 回答
0

为了测试,您可以覆盖(猴子补丁,如果您只想在测试环境中使用它)__ getattribute__。

在 __getattribute__ 检查是否调用了属性 moon,返回值或将值设置在临时 var 中。

于 2011-03-31T16:50:56.167 回答