2012-08-03 26 views
7

मुझे एक एपीआई से JSON संरचना मिल रही है और जांच करने की आवश्यकता है, चाहे सफल प्रतिक्रिया में विशिष्ट मानों के साथ दो विशिष्ट विशेषताएं हों।किसी ऑब्जेक्ट के एकाधिक गुणों का परीक्षण कैसे करें

कुंजी समस्याओं:

  1. मैं पूरी वस्तु तुलना नहीं कर सकते, के रूप में वहाँ कुछ गुण है, जो प्रत्येक अनुरोध
  2. मैं दो टेस्ट (प्रत्येक विशेषता के लिए) नहीं लिख सकते हैं के साथ भिन्न हो सकते हैं, क्योंकि यह हो सकता है केवल सफल प्रतिक्रिया के रूप में माना जाता है जब दोनों गुण सही मूल्यों से मेल खाते हैं।

उदाहरण सफल प्रतिक्रिया:

{ 
    'success': true, 
    'user_ip': '212.20.30.40', 
    'id': '7629428643' 
} 

गंदा समाधान

<?php 
public function testAddAccount() { 
    $response = $this->api->addAccount('7629428643'); 

    $this->assertTrue(
     $response->success === TRUE && 
     $response->id === '7629428643' 
    ); 
} 

होगा लेकिन मुझे लगता है कि बेहतर और क्लीनर समाधान होना चाहिए, वहाँ है?

+2

यह मेरे लिए बहुत साफ दिखता है। – Matt

+0

वह समाधान आपको बता सकता है कि परीक्षण विफल रहता है, लेकिन आपको यह नहीं बता सकता कि वास्तव में क्या गलत है, यही कारण है कि मैं इसे "गंदा" मानता हूं। –

उत्तर

0

यदि assertTrue() एक सफल प्रतिक्रिया के बूलियन को संग्रहीत करता है तो यह तरीका है कि मैं इसे कैसे संभालेगा। ध्यान रखें कि यह स्वाद का मामला है।

private $lastResponse; 
// $id given elsewhere 
public function testAddAccount($id) { 
    $this->lastResponse = $this->addAccount($id); 
} 

private function addAccount($id) { 
    return $this->api->addAccount($id); 
} 

private function isLastResponseValid($response){ 
    return $this->lastResponse->success === TRUE 
    && $this->lastResponse->id === '7629428643'; 
} 
0

आप इस तरह के मामलों के लिए एक परीक्षण विधि में एकाधिक दावे का उपयोग कर सकते हैं। साथ ही, जब भी संभव हो तो assertEquals जैसे अधिक विशिष्ट दावे का उपयोग करें क्योंकि इससे बेहतर विफलता संदेश प्रदान किए जाएंगे।

public function testAddAccount() { 
    $response = $this->api->addAccount('7629428643'); 

    self::assertTrue($response->success); 
    self::assertEquals('7629428643', $response->id); 
} 
0

जैसा कि कुछ उत्तर में बताया गया है, आपको assertEquals() विधि का उपयोग करना चाहिए। दूसरा भाग यह है कि आप कुछ दावे का उपयोग कर सकते हैं। तो अगर phpunit पहले दावे पर विफलता का पता लगाता है, तो पूरा परीक्षण विफल रहता है।

assertTrue() का उपयोग क्यों नहीं करें? क्योंकि यह स्पष्ट नहीं है कि, उदाहरण के लिए, कोड के एक स्थान पर if ($object) ... और assertTrue($object); का उपयोग अन्य में करें।

साथ ही, सुनिश्चित करें कि आपका दिनचर्या सही तरीके से निष्पादित हो। तो अगर आपको प्रतिक्रिया प्राप्त करने का प्रयास करते समय अपवाद मिलता है - परीक्षण विफल हो जाएगा। हालांकि अपवादों को परीक्षण मामलों के रूप में भी जांचना चाहिए। यही है, आपको गलत अनुरोध पोस्ट करने का प्रयास करना चाहिए और अपवाद डालना है। यही कारण है कि कितना अच्छा परीक्षण की तरह लग रहा है - यह, सभी संभव स्थितियों की जाँच करनी चाहिए hehe =)

तो, यह कोड आपको मिल चाहिए:

public function testAddAccount() { 
    $response = $this->api->addAccount('7629428643'); 

    $this->assertEquals($response->success, true); 
    $this->assertEquals($response->id, '7629428643'); 

    $this->setExpectedException('MyException'); 

    $response = $this->api->addAccount('wrong_account'); 
} 
2

आप प्रत्येक संपत्ति आप सत्यापित करना चाहते हैं के लिए assertEquals() उपयोग करना चाहते हैं । जबकि आप आम तौर पर प्रत्येक टेस्ट केस में केवल एक चीज का परीक्षण करना चाहते हैं, कभी-कभी "एक चीज़" का परीक्षण करने के लिए कई दावों की आवश्यकता होती है। इस कारण से, कई दावे ठीक हैं।

आप यह भी कहना चाहेंगे कि गुण $response ऑब्जेक्ट पर नोटिस से बचने के लिए मौजूद हैं।एक उदाहरण के लिए निम्न देखें:

public function testAddAccount() { 
    // Attempt to create an account. 
    $response = $this->api->addAccount('7629428643'); 

    // Verify that the expected properties are present in the response. 
    $this->assertObjectHasAttribute('success', $response); 
    $this->assertObjectHasAttribute('id', $response); 

    // Verify the values of the properties. 
    $this->assertEquals(true, $response->success); 
    $this->assertEquals('7629428643', $response->id); 
} 
+0

फिर भी, इस तरह से एक दोष है, कि असफल होने पर, यह आपको दिखाता है कि आप इसे ठीक करने के बाद केवल पहली समस्याग्रस्त जोर से विफल हो जाते हैं, यह आपको एक और दिखाता है। –

+0

यह सच है, लेकिन किसी भी समय एक विफलता पर ध्यान केंद्रित करना सबसे अच्छा है। यह असामान्य नहीं है कि पहली विफलता को ठीक करने से परीक्षण मामले में शेष विफलताओं को भी हल किया जाएगा। – JamesArmes

0

स्पष्ट तरीका मैं (हालांकि यह है स्वाद की बात) दो बूलियन अभिव्यक्ति जोड़ सकते हैं और परिणाम पर जोर होगा सोच सकते हैं दो है:

$r1=$response->success === TRUE; 
$r2=$response->id === '7629428643'; 
$this->assertEquals(2, $r1+$r2, "Expecting both values to match; got ($r1) and ($r2)"); 

बेशक, आप इस सेटअप को सरणी और array_sum()==count(), और अधिक प्रेमपूर्ण संदेशों के साथ किसी भी परीक्षण में विस्तारित कर सकते हैं।

1

किसी भी अत्यधिक मूल्य को अनदेखा करते हुए प्रतिक्रिया और सही उत्तर के बीच अंतर की गणना करें। यदि कोई फर्क नहीं पड़ता है, तो सब कुछ ठीक है; यदि वहां है, तो आपको पूरी जानकारी मिल जाएगी।

//some examples 
$responseValues = array('success' => true, 'user_ip' => '212.20.30.40', 'id' => '7629428643'); //success 
$errorResponseValues = array('success' => false, 'user_ip' => '212.20.30.40', 'id' => '7629428643'); //failure 
$errorResponseValues2 = array('success' => false, 'user_ip' => '212.20.30.40', 'id' => '123'); //failure 

$expectedValues = array('success' => true, 'id' => '7629428643'); //what is success 

function whatIsWrong($reality, $expectation) 
{ 
    return array_uintersect_assoc($reality, $expectation, function($a, $b){return (int)($a == $b);}); //This is slightly dirty, I think the final implementation is up to you 
} 

var_dump(whatIsWrong($responseValues, $expectedValues)); //array() 
var_dump(whatIsWrong($errorResponseValues, $expectedValues)); //array('success' => false) 
var_dump(whatIsWrong($errorResponseValues2, $expectedValues)); //array('success' => false, id => 123) 

तो फिर तुम assertEqual उपयोग कर सकते हैं (whatIsWrong (...), सरणी()) है, जो उत्पादन विफलता पर अंतर है, या काफी किसी भी पसंदीदा तरीके से प्रबंधित करें।

संबंधित मुद्दे

 संबंधित मुद्दे