2017-10-19 67 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 –

相關問題