Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rewrite model @property in Factory Boy's object factory

I want to find a way to properly test my code with Factory Boy.

There are a model, like this:

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>

There is a factory for this model:

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

Can anyone help me with that? I didn't found mentions about this in factory boy's documentation, and various variants i've tried doesn't seem to work.

like image 767
G Plotur Avatar asked Oct 19 '12 09:10

G Plotur


2 Answers

As Suganthi said, you can using mock.

But I offer another solution:

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

Just mock property during generation models. It works on factoryboy==2.5.2

like image 134
StasEvseev Avatar answered Nov 06 '22 15:11

StasEvseev


Have you tried using mocks?

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)
like image 2
Suganthi Avatar answered Nov 06 '22 14:11

Suganthi