【问题标题】:Django: Class object has no attribute of standard functionDjango:类对象没有标准函数的属性
【发布时间】:2018-03-31 01:44:33
【问题描述】:

我有一个模型:

class Order(models.Model):

    STATUS_CHOICES = (
        (100, 'First'),
        (200, 'Second'),
    )
    status = models.IntegerField('Status', choices=STATUS_CHOICES)

    def accept(self):
        self.status = 200
        self.save()
        return self.status, self.get_status_display()

我有一个单元测试:

class CustomTestCase(TestCase):

    @classmethod
    def setUp(self):
        pass

    @classmethod
    def save(self):
        pass


class OrderTest(CustomTestCase):

    def test_accept(self):
        result = Order.accept(self)
        expected = (200, 'Second')

        self.assertEqual(expected, result)

如您所见,我添加了什么都不做的“保存”功能,原因是没有自定义的“保存”功能,我不断收到此错误:

[OrderTest] 对象没有属性 [save]

如果该自定义“保存”功能有更好的解决方案,请告诉我。但是这种解决方案不适用于 django 内置的 'get_status_display()' 函数。如果没有解决方案,我会一直遇到这个问题:

[OrderTest] 对象没有属性 [get_status_display]

我可以做些什么来根据需要完成这项工作?

【问题讨论】:

  • 应该将self传递给accept函数吗? Oder.accept() ?
  • 在这种情况下,我得到:“TypeError: accept() missing 1 required positional argument: 'self'”

标签: python django unit-testing


【解决方案1】:

如果您想测试accept 方法,只需像这样创建一个新订单:

 def test_accept(self):
    order = Order.objects.create(status=100)
    result = order.accept()
    expected = (200, 'Second')
    self.assertEqual(expected, result)

你得到[OrderTest] object has no attribute [save]错误的原因是你将测试对象传递给accept方法(在“Order.accept(self)”中),所以当self.save()被调用时,它实际上是在寻找save测试类的方法。

希望这会有所帮助。

【讨论】:

  • 非常感谢!但是我不明白一件事,如果我必须实际创建用于测试的对象,那么模拟的目的是什么?例如,我尝试这样做: order = Mock(spec=Order) 但它不起作用,但是: order = Order.objects.create(status=100) 工作得很好。如果我必须通过“Model.objects.create”为每个单元测试创​​建新对象,为什么还要使用模拟?
猜你喜欢
  • 2013-04-29
  • 2011-10-13
  • 1970-01-01
  • 1970-01-01
  • 2020-01-12
  • 1970-01-01
  • 1970-01-01
  • 2012-03-17
  • 2019-06-23
相关资源
最近更新 更多