/ / Prepíšte model @property v továrni Factory Boy's Object - python, django, unit-testing, factory-boy

Prepísať model @property v objekte Factory Boy - python, django, unit-testing, factory-boy

Chcem nájsť spôsob, ako správne otestovať svoj kód s Factory Boy.

Existuje model, ako je tento:

from django.db import models

class MyModel(models.Model):
param1 = <some field>
param1 = <some field>
param1 = <some field>

@property
def is_smth(self):
<some complicated code that returns boolean>

Pre tento model existuje továreň:

import factory

class MyModelFactory(factory.DjangoModelFactory):
param1 = <some value>
param2 = <some value>
param3 = <some value>

# And here i need to "rewrite" property of the model
# so that it would always return true

Môže mi s tým niekto pomôcť? Nenašiel som o tom zmienky v dokumentácii výrobného chlapca a zdá sa, že rôzne varianty, ktoré som vyskúšal, nefungujú.

odpovede:

1 pre odpoveď č. 1

Skúsili ste použiť falošné?

def test_is_smith(self):
mymodel = MyModel()
with mock.patch("MyModel.is_smith", new_callable=mock.PropertyMock) as mocked_model:
mocked_model.return_value = True
self.assertTrue(mymodel.is_smith)

0 pre odpoveď č. 2

Ako povedal Suganthi, môžete použiť falošné.

Ale ponúkam ďalšie riešenie:

 @classmethod
def _create(cls, model_class, *args, **kwargs):
with mock.patch("MyModel.is_smth",
new_callable=mock.PropertyMock) as m:
m.return_value = True
return super()._create(model_class, *args, **kwargs)

Počas modelov generácie iba zosmiešňujte vlastníctvo. Funguje to ďalej factoryboy==2.5.2


0 pre odpoveď č. 3

Návrh @ StasEvseev v našom prípade nefungoval. Nakoniec som využil Factory Boy post_generation háčiky, pretože naša nehnuteľnosť počíta hodnotu na základe iných modelov / údajov. Budovanie údajov potrebných do @is_smth ak sa táto vlastnosť nazýva:

class MyModelFactory(factory.DjangoModelFactory):
...

@factory.post_generation
def prepare_data_for_is_smth(self, create, extracted, **kwargs):
# Populate/build here the models/fields needed for your
# <some complicated code that returns boolean>.

Háčiky po generácii sa vykonajú po vytvorení inštancie závodu. Dalo by sa ďalej prispôsobiť správanie háku pomocou extracted a kwargs parametre, ktoré sa odovzdávajú v továrni triedy pomocou ATTR__SUBATTR formát (napr. MyModelFactory(foo__bar=SOME_VALUE).