auto_add с FactoryBoy - PullRequest
       20

auto_add с FactoryBoy

0 голосов
/ 11 октября 2018

Эта проблема: https://github.com/FactoryBoy/factory_boy/issues/102 описывает, как вам следует протестировать «созданное» поле в django.

Как это следует реализовать для auto_add (вместо auto_add_now)?У меня есть «обновленное» поле, но использую ли я

models.DateTimeField(auto_now=True) 

или переопределяю метод django .save () модели

def save(self, *args, **kwargs):
    """On save, update updated timestamp"""
    self.updated = timezone.now
    return super(Task, self).save(*args, **kwargs)

Я не могу заставить FactoryBoy возвращатьзначение updated, которое я хочу - он всегда возвращает timezone.now ()

LazyAttribute(lambda o: o.created + timedelta(hours=1))   # ignored by auto_add

или использует метод _create (), как предлагается в выпуске GitHub:

@classmethod
def _create(cls, target_class, *args, **kwargs)
    updated = kwargs.pop('updated', None)
    obj = super(TaskFactory, cls)._create(target_class, *args, **kwargs)
    if updated is not None:
        obj.updated = updated
        obj.save()   # <-- calls .save() method overriding with timezone.now()
    return obj

Что такоелучший способ пойти сюда?

1 Ответ

0 голосов
/ 11 октября 2018

Для всех, кто до сих пор боролся с этим, пока единственный способ, который я нашел в этом, состоит в том, чтобы monkeypatch метод .save () на исходной модели перед передачей в Factory boy:

models.py:

updated = models.DateTimeField(default=timezone.now)
def save(self, *args, **kwargs):
    """On save, update updated timestamp"""
    self.updated = timezone.now
    return super(Task, self).save(*args, **kwargs)

factories.py:

updated = LazyAttribute(lambda o: o.created + timedelta(hours=1))

def patched_save(self, *args, **kwargs):
    return super(Task, self).save(*args, **kwargs)

Task.save = patched_save

, но хотел бы услышать альтернативные (вероятно, лучшие) предложения!

...