অ্যাসেটকুইলস এবং অ্যাসেটসামের মধ্যে পার্থক্য কি ফুনপুনিতে?


121

পিএইচপিউনিতে একটি অ্যাসেটক্যুয়ালস পদ্ধতি রয়েছে: 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
assertEquals এমনকি মনে করে '0012' == '12'। এমনকি যদি উভয় মানই স্ট্রিং হয় তবে তারা তুলনার জন্য পূর্ণসংখ্যায় রূপান্তরিত হয়! আপনি যখনই পারেন সত্যিকারের assertSame ব্যবহার করা উচিত।
মার্কো ফিসেট

2
দুর্ভাগ্যক্রমে এমনকি অ্যাসেটকুইকেলগুলি পিকে উদাহরণস্বরূপ বলে মনে হয় যখন অ্যারের বৈশিষ্ট্যগুলির সাথে তুলনা করা হয় এবং তখন স্ট্রিং বনাম ইন্ট সম্পর্কে অভিযোগ করা হয়।
andig

1
মার্কো ফিসেটের মন্তব্যের পরে, এই আচরণটি পিএইচপিউনিট ৪.০ এর পর থেকে আর নেই, আপগ্রেড নোটগুলি দেখুন
গ্রাস ডাবল

@ কোভেক্স রেফারেন্সটি দুর্দান্ত, তবে ইউআরএলটি ভুল (স্কোয়ার বন্ধনী বন্ধ করার কারণে) ... আপনি কি এটি ঠিক করতে পারেন? ধন্যবাদ!
খ্রিস্টান

3
বস্তুর সাথে তুলনা করার বিষয়ে গুরুত্বপূর্ণ নোট assertSame()। যদি দুটি ভেরিয়েবল প্রত্যাশিত এবং $ প্রকৃত একই বস্তুর উল্লেখ না করে তবে $ বার্তা দ্বারা চিহ্নিত ত্রুটির প্রতিবেদন করে। phpunit.de/manual/current/en/…
কোভেক্স

23

যখন বস্তুর তুলনা চলে আসে:

assertSame: কেবলমাত্র 2 টি অবজেক্ট একই অবজেক্টের উদাহরণটিকে উল্লেখ করে তবেই দৃ .়তা দিতে পারে। সুতরাং 2 টি পৃথক বস্তুর যদি তাদের সমস্ত বৈশিষ্ট্যের জন্য একই মান একই থাকে তবে আস্রেটসেম ব্যর্থ হবে যদি তারা একই উদাহরণটিকে উল্লেখ না করে।

    $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 পৃথক বস্তু যে কোনও ক্ষেত্রে তাদের বৈশিষ্ট্যের মানগুলির সাথে মেলে কিনা তা দৃsert়ভাবে জানাতে পারে। সুতরাং এটি হ'ল অবজেক্ট ম্যাচের জন্য উপযুক্ত পদ্ধতি।

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

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


7
যদিও এই উত্তরটি বিস্তৃত নয় (এটি কেবলমাত্র বিষয়গুলি কভার করে) তবে এটি আমার জানা উচিত ছিল needed ধন্যবাদ! :)
রিনোগো

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

প্রথমটি পাস হবে!

দ্বিতীয়টি ব্যর্থ হবে।

এটাই পার্থক্য।

আমি মনে করি আপনার সর্বদা assertSame ব্যবহার করা উচিত।


আমি পরীক্ষা চালিত বিকাশের সময় এই গোটাচাটি করেছি। পরীক্ষা উত্তীর্ণ হয়েছে, ধরে নেওয়া হয়েছে যে মান 3 ফেরত আসছিল তবে সত্য সত্যই ফিরে এসেছিল। আকর্ষণীয়ভাবে $ এটি-> assertEquals ('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()মূলত একটি ব্যাখ্যা করা মান সম্পর্কে, এটি জাগলিং টাইপ বা একটি __ মজিক উপস্থাপনা পদ্ধতি সহ কোনও বস্তু ( __toString()উদাহরণস্বরূপ) হোক।

একটি ভাল ব্যবহারের ক্ষেত্রে assertSame()একটি সিঙ্গলটন কারখানার পরীক্ষা করা।

class CacheFactoryTest extends TestCase
{
    public function testThatCacheFactoryReturnsSingletons()
    {
        $this->assertSame(CacheFactory::create(), CacheFactory::create());
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.