1

別のモデルへの外部キーを持つモデルが django にあり、単体テスト中に 2 つのモデルの密結合を避け、毎回異なる値を返す他のモデルのスタブを作成したいと考えています。

考案された例:

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が呼び出されているかどうかを確認し、値を返すか、一時変数に値を設定します。

于 2011-03-31T16:50:56.167 に答える