工厂男孩属性属性?

时间:2018-08-27 15:35:12

标签: python django testing pytest factory-boy

我有这样的食谱:

import factory
from models import Foobar


class MenuItemFactory(factory.Factory):
    class Meta:
        model = MenuItem

    name = 'Default Foobar'
    url = factory.LazyAttribute(lambda o: '/%s' % o.name)

我想添加动态属性,例如slug,但我想用一个单独的方法来做。我想要这个,因为用lambda一线代码编写任何更复杂的逻辑都是很丑陋的。

使用property方法想到了一个想法,就像在Django模型中一样。例如:

class MenuItemFactory(factory.Factory):
    ...

    @property
    def url(self):
        return '/%s' % self.name

是否有类似的方法可以完成我想做的事情?

编辑

最后我要完成的是:

menu_item = MenuItemFactory(name='foobar')

menu_item.name = 'foobar'
menu_item.url = '/foobar'

slug用作动态属性。换句话说,我正在寻找一个合适的位置来存储我的动态属性逻辑

2 个答案:

答案 0 :(得分:1)

您可以使用内置https://docs.python.org/3.6/library/functions.html#property

的属性
class Test:
    name = 'bar'

def fget(self):
    return self.name

def fset(self, name):
    self.name = name

Test.slug = property(fget=fget, fset=fset)
t = Test()
print(t.slug)    # 'bar'
t.slug = 'foo'
print(t.slug)    # 'foo'

答案 1 :(得分:0)

结果非常简单,花了我一段时间才在文档中找到它。

@factory.lazy_attribute
def url(self):
    return '/%s' % self.name