Тестирование Django: Как заглушить это свойство model.ForeignKey? - PullRequest
1 голос
/ 31 марта 2011

У меня есть модель в 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'

Теперь я хочу протестировать свойство Wolf (). Moon после того, как я выполню вызов update_mood (), вообще не затрагивая модель Луны - потому что это очень сложная модель, которая вычисляется во всех видах внешних систем. вне его фазы.

Обычно для этого я использовал бы исправление обезьян, но, поскольку .mood - это свойство ... Я не могу присвоить его способом исправления обезьян.

Справка.

Ответы [ 2 ]

2 голосов
/ 06 апреля 2011

Немного покопавшись, наткнулся на метод модели 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'
0 голосов
/ 31 марта 2011

Ради тестирования вы можете переопределить (monkey patch, если вы хотите использовать его только в тестовой среде) __ getattribute__.

В __ getattribute__ проверьте, вызывается ли свойство moon, вернуть значение или установить его во временную переменную.

...