मुखर और मुखर के बीच अंतर phpunit में?


121

PHPUnit में एक मुखर विधि शामिल है: https://phpunit.de/manual/current/en/appendixes.assertions.html#appendixes.assertions.assertEquals

इसकी एक मुखर विधि भी है: https://phpunit.de/manual/current/en/appendixes.assertions.html#appendixes.assertions.assertSame

पहली नज़र में ऐसा लगता है कि वे भी यही काम करते हैं। दोनों के बीच क्या अंतर है? वे दोनों निर्दिष्ट क्यों हैं?

जवाबों:


198

मैं छिटपुट रूप से दोनों का उपयोग करता हूं, लेकिन डॉक्स के अनुसार:

assertSame

$messageयदि दो चर $expectedऔर $actualएक ही प्रकार और मूल्य नहीं हैं, तो पहचान की गई त्रुटि की रिपोर्ट करता है । "

और जैसा कि आप ऊपर दिए गए अंश के नीचे दिए गए उदाहरण में देख सकते हैं, वे गुजर रहे हैं '2204'और 2204, जो assertSameकि प्रयोग करने में विफल हो जाएंगे क्योंकि एक एक है stringऔर एक int,मूल रूप से है:

'2204' !== 2204
assertSame('2204', 2204) // this test fails

assertEquals

"दो चर $ अपेक्षित और $ वास्तविक समान नहीं होने पर $ संदेश द्वारा पहचानी गई त्रुटि की रिपोर्ट करता है।"

assertEqualsउपर्युक्त उदाहरण का उपयोग करते हुए विचार करने के लिए डेटाटाइप लेने के लिए प्रकट नहीं होता है 2204:

'2204' == 2204
assertEquals('2204', 2204) // this test passes

मैंने उपर्युक्त उदाहरणों के खिलाफ कुछ यूनिट परीक्षण किए, और वास्तव में वे दस्तावेजी व्यवहार के परिणामस्वरूप हुए।


17
मुखर भी लगता है कि '0012' == '12'। यहां तक ​​कि अगर दोनों मूल्य तार हैं, तो वे तुलना के लिए पूर्णांक में बदल जाते हैं! जब भी आप कर सकते हैं आप वास्तव में जोर का उपयोग करना चाहिए।
मार्को-फिसेट

2
दुर्भाग्य से भी assertEquals एसी गुणों की तुलना करते समय picky प्रतीत होता है और तब स्ट्रिंग बनाम इंट के बारे में शिकायत करता है।
andig

1
मार्को-फ़िसेट की टिप्पणी के बाद, ध्यान दें कि यह व्यवहार अब PHPUnit 4.0 के बाद का मामला नहीं है, अपग्रेड नोट देखें
ग्रास डबल

@coviex संदर्भ ठंडा है, लेकिन URL गलत है (वर्ग ब्रैकेट बंद करने के कारण) ... क्या आप इसे ठीक कर सकते हैं? धन्यवाद!
क्रिश्चियन

3
पर महत्वपूर्ण सूचना वस्तुओं की तुलना के साथ assertSame()। $ चर संदेश की पहचान की गई त्रुटि की रिपोर्ट करता है यदि दो चर $ अपेक्षित और $ वास्तविक समान वस्तु का संदर्भ नहीं देते हैं। phpunit.de/manual/current/en/…
coviex

23

जब यह वस्तुओं की तुलना करता है:

अगर ऑब्जेक्ट 2 ऑब्जेक्ट्स एक ही ऑब्जेक्ट इंस्टेंस को संदर्भित कर रहे हैं, तो केवल दावा कर सकते हैं। इसलिए, भले ही 2 अलग-अलग वस्तुओं में उनके सभी गुणों के लिए बिल्कुल समान मान हों, लेकिन यदि वे एक ही उदाहरण को संदर्भित नहीं करते हैं, तो AsserSame विफल हो जाएगा।

    $expected = new \stdClass();
    $expected->foo = 'foo';
    $expected->bar = 'bar';

    $actual = new \stdClass();
    $actual->foo = 'foo';
    $actual->bar = 'bar';

    $this->assertSame($expected, $actual); FAILS

assertEquals: यदि 2 अलग-अलग ऑब्जेक्ट किसी भी स्थिति में उनके विशेषता मानों से मेल खाते हैं, तो मुखर कर सकते हैं। तो यह ऑब्जेक्ट मिलान के लिए उपयुक्त विधि है।

    $this->assertEquals($expected, $actual); PASSES

https://phpunit.de/manual/current/en/appendixes.assertions.html


7
हालांकि यह उत्तर व्यापक नहीं है (यह केवल वस्तुओं को शामिल करता है), यह वही है जो मुझे जानना आवश्यक है। धन्यवाद! :)
रिनोगो

20
$this->assertEquals(3, true);
$this->assertSame(3, true);

पहले वाला पास होगा!

दूसरा फेल हो जाएगा।

यही अंतर है।

मुझे लगता है कि आपको हमेशा दावे का इस्तेमाल करना चाहिए।


मैं सिर्फ परीक्षण संचालित विकास के दौरान यह गोचा था। परीक्षण पारित किया गया, मान लिया गया कि 3 लौटाया जा रहा है लेकिन वास्तव में सच लौटाया गया था। दिलचस्प रूप से यह $>> जोर ('3', सच); विफल रहता है।
dwenaus

3

जैसा कि पहले कहा गया है, AssertSameएक त्रुटि की रिपोर्ट करता है यदि दो तत्व प्रकार और मूल्य साझा नहीं करते हैं, लेकिन डंपिंग से यह नोट करना महत्वपूर्ण है :

$ संदेश द्वारा पहचानी गई त्रुटि की रिपोर्ट करता है यदि दो चर $ अपेक्षित और $ वास्तविक एक ही वस्तु को संदर्भित नहीं करते हैं।

तो यह परीक्षण भी विफल होगा, भले ही वे प्रकार और मूल्य साझा करें:

class SameTest extends TestCase
{
    public function testFailure()
    {
        $this->assertSame(new stdClass, new stdClass);
    }
}

1

इसके अलावा,

// Passes
$this->assertSame("123.", "123.");
$this->assertEquals("123.", "123");
// Fails
$this->assertSame("123.", "123");

0

assertSame () == टेस्ट कि अगर वास्तविक आउटपुट और अपेक्षित पैरामीटर समान हैं।

अर्थात् :

$this->assertSame('$expected','$expected');

या

$this->assertSame('100','100');

assertEquals == यदि हम किसी वेबसाइट पेज के संबंध में देखते हैं, तो मेरे पास एक पृष्ठ है जिसमें 2 'तालिका' है, इसलिए जब मैं assertEquals चलाता हूं तो मैं इसकी गिनती की जांच करूंगा कि 'टेबल' काउंट फ़ंक्शन का उपयोग करके 2 हैं। उदाहरण के लिए:

$this->assertEquals(2, $var->filter('table')->count()); 

यहाँ हम यह देख सकते हैं कि परखें कि वेब पेज पर 2 टेबल पाए गए हैं। हम पृष्ठ पर पाए गए विभाजनों का उपयोग ब्रैकेट के अंदर '# डिविज़न नाम' का उपयोग करके भी कर सकते हैं।

उदाहरण 2:

public function testAdd()
{
    $calc = new Calculator();

    $result = $calc->add(30, 12);

    // assert that our calculator added the numbers correctly!
    $this->assertEquals(42, $result);
}

1
कृपया कोड स्वरूपण का उपयोग कोड भागों को अधिक सुपाच्य बनाने के लिए करें, और #जब तक आप शीर्ष बनाना नहीं चाहते तब तक मार्कअप का उपयोग करने से बचें ।
laalto

0

जैसा कि पहले उल्लेख किया गया है, assertEquals()मुख्य रूप से एक व्याख्या किए गए मूल्य के बारे में है, यह प्रकार की बाजीगरी या एक ऑब्जेक्ट के साथ हो सकता है __magic प्रस्तुति विधि ( __toString()उदाहरण के लिए)।

एक assertSame()एकल कारखाने के लिए एक अच्छा उपयोग मामला परीक्षण कर रहा है।

class CacheFactoryTest extends TestCase
{
    public function testThatCacheFactoryReturnsSingletons()
    {
        $this->assertSame(CacheFactory::create(), CacheFactory::create());
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.