2017-08-09 33 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