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ď č. 1Skú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)
.