2017-08-09 7 views
0

J'ai un modèle Django. Entre autres choses, il a une ForeignKey à User:Retarder l'évaluation des stratégies d'hypothèses pour les modèles Django

class MyModel(models.Model): 
    foo = models.BooleanField() 
    bar = models.ForeignKey(User) 

J'ai une méthode dans mes tests qui me génère une forme appropriée User - generate_test_user()

Je veux écrire quelques tests avec Hypothesis pour faire valoir des propriétés variées sur instances de mon modèle.

Ma première mise en œuvre ressemblait à ceci:

class MyTestCase(TestCase): 

    @hypothesis.given(models(MyModel, bar=just(generate_test_user()))) 
    def test_my_model(self, mymodel): 
     pass 

Cependant cela échoue parce que generate_test_user est appelé au moment de l'importation et essaie donc de créer un modèle avant de migrations Django etc. se sont heurtées.

Quel est un bon moyen d'élaborer une stratégie de sorte que les bonnes choses soient évaluées au bon moment/à l'évaluation du délai de l'appel just/similaire?

Répondre

1

TL; DR Je voulais builds pas just

De hypothesis.strategies:

def just(value): 
    """Return a strategy which only generates value. 

    Note: value is not copied. Be wary of using mutable values. 

    """ 

alors (sous la direction de brièveté):

def builds(target, *args, **kwargs): 
    """Generates values by drawing from ``args`` and ``kwargs`` and passing 
    them to ``target`` in the appropriate argument position. 

    e.g. ``builds(target, integers(), flag=booleans())`` would draw an 
    integer ``i`` and a boolean ``b`` and call ``target(i, flag=b)``. 

Ainsi mon original

@hypothesis.given(models(MyModel, bar=just(generate_test_user()))) 
def test_my_model(self, mymodel): 
    pass 

est devenu

@hypothesis.given(models(MyModel, bar=builds(generate_test_user))) 
def test_my_model(self, mymodel): 
    pass 

et tout était comme je le voulais, avec generate_test_user appelé exactement au bon moment, à chaque essai

1

Sons comme vous devez draw the strategy interactively plutôt que de spécifier dans @given():

@given(data()) 
def test_my_model(self, data): 
    mymodel = data.draw(models(MyModel, bar=just(generate_test_user()))) 
    # Run assertions on mymodel