Django模型假设策略的延迟评估

2024-04-27 03:39:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Django模型。除此之外,它还有ForeignKeyUser

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调用/类似的评估?你知道吗


Tags: django方法模型testmodelfoomodelsbar
2条回答

听起来您需要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

我要的是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

相关问题 更多 >