【问题标题】:Rewrite model @property in Factory Boy's object factory在 Factory Boy 的对象工厂中重写模型 @property
【发布时间】:2012-10-09 20:56:01
【问题描述】:

我想找到一种使用 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

谁能帮我解决这个问题?我没有在工厂男孩的文档中找到关于此的提及,而且我尝试过的各种变体似乎都不起作用。

【问题讨论】:

    标签: python django unit-testing factory-boy


    【解决方案1】:

    @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>.
    

    后生成挂钩在创建工厂实例后执行。您可以使用extractedkwargs 参数进一步自定义钩子的行为,这些参数使用ATTR__SUBATTR 格式在工厂类中传递(例如MyModelFactory(foo__bar=SOME_VALUE)

    【讨论】:

      【解决方案2】:

      正如 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

      【讨论】:

        【解决方案3】:

        您是否尝试过使用模拟?

        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)
        

        【讨论】:

          猜你喜欢
          • 2020-07-24
          • 1970-01-01
          • 2019-12-22
          • 1970-01-01
          • 2020-08-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-05-08
          相关资源
          最近更新 更多