2017-10-19 69 views
2

的属性我有一个模型:Django的:类对象没有标准功能

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] object has no attribute [save]

如果有更好的解决方案来定制'保存'功能,请告诉我。但是这种解决方案不适用于django内置的'get_status_display()'函数。没有解决方案,我一直得到这个麻烦:

[OrderTest] object has no attribute [get_status_display]

我能做些什么来使这项工作,因为我需要?

+0

应该自我传递给accept函数吗? Oder.accept()? –

+0

在这种情况下,我得到:“TypeError:accept()缺少1所需的位置参数:'self'” – Madi7

回答

5

如果你想测试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方法。

希望这会有所帮助。

+1

非常感谢!但是我不明白一件事,如果我必须真正地创建用于测试的对象,嘲笑的目的是什么?例如,我尝试这样做:order = Mock(spec = Order),但它不起作用,但是:order = Order.objects.create(status = 100)完美地工作。如果我必须通过'Model.objects.create'为每个单元测试创​​建新对象,为什么要使用嘲讽? – Madi7

+0

@ Madi7 https://stackoverflow.com/questions/3622455/what-is-the-purpose-of-mock-objects –

相关问题