延迟评估 Django 模型的假设策略
Delaying evaluation of Hypothesis strategies for Django models
我有一个 Django 模型。除其他外,它有一个 ForeignKey
到 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
调用/类似方法的好方法是什么?
听起来您需要 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
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
在每次测试 运行
中都在正确的时间调用
我有一个 Django 模型。除其他外,它有一个 ForeignKey
到 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
调用/类似方法的好方法是什么?
听起来您需要 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
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
在每次测试 运行