【问题标题】:Factory-boy property attributes?工厂男孩的属性?
【发布时间】:2018-08-27 15:35:12
【问题描述】:

我有这样的食谱:

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 充当动态属性。换句话说,我正在寻找一个合适的地方来存储我的动态属性逻辑

【问题讨论】:

  • 你想在创建类时给 LazyAttribute 一个函数吗?还是在创建类后即时设置属性?
  • @bboumend 我想动态设置一个属性

标签: python django testing pytest factory-boy


【解决方案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'

【讨论】:

    【解决方案2】:

    原来它很简单,我花了一段时间才在文档中找到它。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-13
      • 2015-10-26
      • 2021-05-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多