0

我有一个 Django 模型。除其他外,它有一个ForeignKeyto User

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呼叫/类似情况的好方法是什么?

4

2 回答 2

1

听起来您需要以交互方式绘制策略,而不是在以下位置指定它@given()

@given(data())
def test_my_model(self, data):
    mymodel = data.draw(models(MyModel, bar=just(generate_test_user())))
    # Run assertions on mymodel
于 2017-08-10T11:16:13.207 回答
1

TL;DR 我builds不想just

来自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在每次测试运行时都在正确的时间调用

于 2017-09-19T10:12:12.153 回答