2017-08-09 31 views
0

私はDjangoモデルを持っています。とりわけそれはForeignKeyUserにありますDjangoモデルのための仮説戦略の遅延評価

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

私は私を生成し、私のテストでメソッドを持って適切な形状のUser - generate_test_user()

私はおよそ各種プロパティを主張するHypothesisでいくつかのテストを書きたいです私のモデルのインスタンス。

私の最初の実装は、このように見えた:

class MyTestCase(TestCase): 

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

は、しかし、これはgenerate_test_userは、インポート時に呼び出されるので、失敗したため、などDjangoの移行の前に実行されたモデルを作成しようとします。

justコール/類似の適切な時間/遅延評価で適切なものが評価されるような戦略を立てるには、どのような方法が良いでしょうか?

答えて

1

TL; DRは、私がhypothesis.strategiesからbuildsないjust

を望んでいた:

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

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

    """ 

のために編集した(一方、簡潔性):

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)``. 

このように私の元

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

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

になったと私は、各テストの実行時に、正確に適切なタイミングで呼び出されるgenerate_test_userで、望んでいたように、すべてのでした

1

あなたはdraw the strategy interactivelyにかなり@given()でそれを指定するよりも、必要とするような音:

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