2017-08-09 69 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我想buildsjust

hypothesis.strategies

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