विफल होने के लिए django परीक्षण कैसे लिखना है?




testing tdd (3)

इस तरह कुछ काम करना चाहिए:

thing = Thing.objects.create(name='1234')  
# not sure if you need here .get() or if. create() truncates the field on its own
self.assertEqual(thing.name, '123') # or: self.assertEqual(len(thing.name), 3)

- लेकिन ऐसा परीक्षण अजीब दिखता है :-)

साथ ही, ध्यान दें कि MySQLdb बैकएंड स्ट्रिंग को छोटा करने के बारे में आपको सूचित करने के लिए चेतावनी अपवाद बढ़ाएगा, ताकि आप इसे assertRaises साथ assertRaises

मेरे पास Thing नामक एक मॉडल है जिसे name नामक विशेषता है, और मैं नाम को एक चार फ़ील्ड बनाना चाहता हूं जो केवल 3 वर्ण लंबा है।

मैं इसके लिए एक परीक्षा कैसे लिखूं?

class TestCase1(TestCase):
    def test1(self):
        thing = Thing(name='1234')

वह परीक्षण विफल होना चाहिए। मैं परीक्षण को सही ढंग से कैसे लिखूं ताकि परीक्षण उस ऑब्जेक्ट में विफल हो जाए?


मैं वर्तमान में expectedFailure unittest सजावट का उपयोग कर रहा हूं। यह विज्ञापन के रूप में काम करता है: कोई त्रुटि नहीं होने पर विफल रहता है, विफल होने पर गुजरता है।

मैं expectedFailure विफलता का उपयोग यह सत्यापित करने के लिए करता हूं कि मेरा कस्टम जोर-दिनचर्या वास्तव में काम करती है और न केवल रबरस्टैम्प सब ठीक है।

import unittest
from django.test import TestCase

class EmojiTestCase(TestCase):

    @unittest.expectedFailure
    def testCustomAssert(self):
        self.assertHappyFace(':(') # must fail.

लेकिन परीक्षण के दौरान एक चेतावनी संदेश मुद्रित करता है। मैं इसे Django और नाक के साथ उपयोग करता हूँ। किसने भी देखा है।

/usr/lib64/python3.4/unittest/case.pyLOAD25: रनटाइम चेतावनी: TestResult में कोई ऐडएक्सपेक्टेड विफलता विधि नहीं है, जैसे रनटाइम चेतावनी के रूप में रिपोर्टिंग)

मैं एक बेहतर समाधान खोजने के लिए यहां आया, लेकिन कोई नहीं मिला। तो मैं कम से कम दूसरों को बताना चाहता था कि मैं जो काम कर रहा हूं वह आओ।


यदि आप अपवाद बढ़ाने के लिए थिंग (नाम = '1234') की अपेक्षा कर रहे हैं, तो इससे निपटने के दो तरीके हैं।

एक Django के assertRaises (वास्तव में unittest / unittest2 से) का उपयोग करना है:

def mytest(self):
    self.assertRaises(FooException, Thing, name='1234')

यह विफल रहता है जब तक कि थिंग (name = '1234') FooException त्रुटि को उठाता है। एक और तरीका अपेक्षित अपवाद को पकड़ना है और अगर ऐसा नहीं होता है तो इसे उठाएं, इस तरह:

def mytest(self):
    try:
        thing = Thing(name='1234')
        self.fail("your message here")
    except FooException:
        pass

जाहिर है, FooException को उस स्ट्रिंग के साथ प्रतिस्थापित करें जिसे आप ऑब्जेक्ट बनाने से अपेक्षा करते हैं। मान्यता त्रुटि?

एक तीसरा विकल्प (पायथन 2.7 के रूप में) एक संदर्भ प्रबंधक के रूप में assertRaises का उपयोग करना है, जो क्लीनर, अधिक पठनीय कोड बनाता है:

def mytest(self):
    with self.assertRaises(FooException):
        thing = Thing(name='1234')

अफसोस की बात है, यह कस्टम परीक्षण विफलता संदेशों की अनुमति नहीं देता है, इसलिए अपने परीक्षणों को अच्छी तरह से दस्तावेज करें। अधिक जानकारी के लिए https://hg.python.org/cpython/file/2.7/Lib/unittest/case.py#l97 देखें।





tdd