6

我想找到一种使用 Factory Boy 正确测试我的代码的方法。

有一个模型,像这样:

from django.db import models

class MyModel(models.Model):
    param1 = <some field>
    param1 = <some field>
    param1 = <some field>

    @property
    def is_smth(self):
        <some complicated code that returns boolean>

这个模型有一个工厂:

import factory

class MyModelFactory(factory.DjangoModelFactory):
    param1 = <some value>
    param2 = <some value>
    param3 = <some value>

    # And here i need to "rewrite" property of the model
    # so that it would always return true

任何人都可以帮助我吗?我没有在工厂男孩的文档中找到关于此的提及,而且我尝试过的各种变体似乎都不起作用。

4

3 回答 3

4

正如 Suganthi 所说,您可以使用模拟。

但我提供了另一种解决方案:

 @classmethod
 def _create(cls, model_class, *args, **kwargs):   
     with mock.patch('MyModel.is_smth',
                     new_callable=mock.PropertyMock) as m:
         m.return_value = True
         return super()._create(model_class, *args, **kwargs)

只是在生成模型期间模拟属性。它适用于factoryboy==2.5.2

于 2016-12-02T18:04:35.817 回答
2

您是否尝试过使用模拟?

def test_is_smith(self):
    mymodel = MyModel()
    with mock.patch('MyModel.is_smith', new_callable=mock.PropertyMock) as mocked_model:
        mocked_model.return_value = True
        self.assertTrue(mymodel.is_smith)
于 2013-06-04T09:08:10.737 回答
0

@StasEvseev 的建议在我们的案例中不起作用。我最终利用了 Factory Boy 的post_generation钩子,因为我们的属性是根据其他模型/数据计算值。因此,构建所需的数据@is_smth将使其在调用该属性时按预期运行/评估:

class MyModelFactory(factory.DjangoModelFactory):
    ...

    @factory.post_generation
    def prepare_data_for_is_smth(self, create, extracted, **kwargs):
       # Populate/build here the models/fields needed for your
       # <some complicated code that returns boolean>.

创建工厂实例后执行后生成挂钩。extracted您可以通过使用和kwargs参数来进一步自定义钩子的行为,这些参数使用ATTR__SUBATTR格式(例如MyModelFactory(foo__bar=SOME_VALUE).

于 2018-05-20T20:03:05.453 回答