php পিএইচপি ইউনাইটেড একটি ব্যতিক্রম নিক্ষেপ করা হয়েছে?



exception phpunit (10)

কেউ কি জেনে রাখে যে কোনও assert বা কিছু এমন আছে যা পরীক্ষার কোডে ব্যতিক্রমটি নিক্ষেপ করা হয়েছে কিনা তা যাচাই করতে পারে?


Answer #1

ব্যাপক সমাধান

পিএইচপি ইউনাইটের বর্তমান " সর্বোত্তম অনুশীলন " ব্যতিক্রম পরীক্ষার জন্য মনে হচ্ছে .. অভাবনীয় ( docs )।

যেহেতু আমি বর্তমান expectException বাস্তবায়ন চেয়ে বেশি চেয়েছি , তাই আমি আমার পরীক্ষার ক্ষেত্রে ব্যবহার করার জন্য একটি বৈশিষ্ট্য তৈরি করেছি। এটি শুধুমাত্র ~ 50 লাইন কোড

  • পরীক্ষা প্রতি একাধিক ব্যতিক্রম সমর্থন করে
  • ব্যতিক্রম নিক্ষেপ করা হয় পরে assertions সমর্থন করে
  • শক্তসমর্থ এবং পরিষ্কার ব্যবহার উদাহরণ
  • স্ট্যান্ডার্ড assert সিনট্যাক্স
  • শুধু বার্তা, কোড, এবং বর্গ চেয়ে আরো জন্য assertions সমর্থন করে
  • বিপরীত assertion সমর্থন, assertNotThrows
  • পিএইচপি 7 Throwable ত্রুটি সমর্থন করে

গ্রন্থাগার

আমি AssertThrows এবং packagist AssertThrows বৈশিষ্ট্যটি প্রকাশ packagist যাতে এটি সুরকারের সাথে ইনস্টল করা যেতে পারে।

সহজ উদাহরণ

শুধু সিনট্যাক্স পিছনে আত্মা illustrated:

<?php

// Using simple callback
$this->assertThrows(MyException::class, [$obj, 'doSomethingBad']);

// Using anonymous function
$this->assertThrows(MyException::class, function() use ($obj) {
    $obj->doSomethingBad();
});

বেশ ঝরঝরে?

সম্পূর্ণ ব্যবহার উদাহরণ

আরো ব্যাপক ব্যবহারের উদাহরণের জন্য নিচে দেখুন দয়া করে:

<?php

declare(strict_types=1);

use Jchook\AssertThrows\AssertThrows;
use PHPUnit\Framework\TestCase;

// These are just for illustration
use MyNamespace\MyException;
use MyNamespace\MyObject;

final class MyTest extends TestCase
{
    use AssertThrows; // <--- adds the assertThrows method

    public function testMyObject()
    {
        $obj = new MyObject();

        // Test a basic exception is thrown
        $this->assertThrows(MyException::class, function() use ($obj) {
            $obj->doSomethingBad();
        });

        // Test custom aspects of a custom extension class
        $this->assertThrows(MyException::class, 
            function() use ($obj) {
                $obj->doSomethingBad();
            },
            function($exception) {
                $this->assertEquals('Expected value', $exception->getCustomThing());
                $this->assertEquals(123, $exception->getCode());
            }
        );

        // Test that a specific exception is NOT thrown
        $this->assertNotThrows(MyException::class, function() use ($obj) {
            $obj->doSomethingGood();
        });
    }
}

?>

Answer #2

আপনি একটি পরীক্ষা চালানোর সময় একাধিক ব্যতিক্রম জোর করার জন্য assertException এক্সটেনশান ব্যবহার করতে পারেন।

আপনার TestCase মধ্যে পদ্ধতি প্রবেশ করুন এবং ব্যবহার করুন:

public function testSomething()
{
    $test = function() {
        // some code that has to throw an exception
    };
    $this->assertException( $test, 'InvalidArgumentException', 100, 'expected message' );
}

আমি চমৎকার কোড প্রেমীদের জন্য একটি trait তৈরি ..


Answer #3

একটি বিকল্প উপায় নিম্নলিখিত হতে পারে:

$this->expectException(\InvalidArgumentException::class);
$this->expectExceptionMessage('Expected Exception Message');

আপনার পরীক্ষার ক্লাসটি \PHPUnit_Framework_TestCase করে তা নিশ্চিত করুন।


Answer #4

যদি আপনি পিএইচপি 5.5+ এ চলমান থাকেন, তবে আপনি expectException/setExpectedException সাথে ক্লাসের নামটি পেতে ::class ব্যবহার করতে পারেন। এটি বিভিন্ন সুবিধা প্রদান করে:

  • নামটি তার নামস্থান (যদি থাকে তবে) এর সাথে সম্পূর্ণ যোগ্যতা অর্জন করবে।
  • এটি একটি string সমাধান করে যাতে এটি পিএইচপি ইউনাইটের কোন সংস্করণে কাজ করবে।
  • আপনি আপনার আইডিই মধ্যে কোড সমাপ্তি পেতে।
  • আপনি যদি ক্লাসের নাম ভুল টাইপ করেন তবে পিএইচপি কম্পাইলার একটি ত্রুটি নির্বাহ করবে।

উদাহরণ:

namespace \My\Cool\Package;

class AuthTest extends \PHPUnit_Framework_TestCase
{
    public function testLoginFailsForWrongPassword()
    {
        $this->expectException(WrongPasswordException::class);
        Auth::login('Bob', 'wrong');
    }
}

পিএইচপি কম্পাইল

WrongPasswordException::class

মধ্যে

"\My\Cool\Package\WrongPasswordException"

পিএইচপি ছাড়া বিজ্ঞতা হচ্ছে না।

দ্রষ্টব্য : পিএইচপি ইউনাইটেড 5.2 expectException setExpectedException জন্য প্রতিস্থাপন হিসাবে expectException চালু


Answer #5
/**
 * @expectedException Exception
 * @expectedExceptionMessage Amount has to be bigger then 0!
 */
public function testDepositNegative()
{
    $this->account->deposit(-7);
}

"/**" সম্পর্কে খুব সতর্ক থাকুন, ডবল "*" লক্ষ্য করুন। শুধুমাত্র "**" (asterix) লেখা আপনার কোডটি ব্যর্থ হবে। এছাড়াও phpUnit এর সর্বশেষ সংস্করণ ব্যবহার নিশ্চিত করুন। Phpunit এর কিছু পূর্ববর্তী সংস্করণে @expectedException ব্যতিক্রম ব্যতিক্রম নয়। আমি 4.0 ছিল এবং এটি আমার জন্য কাজ করে না, আমি 5.5 আপডেট করতে হয়েছিল https://coderwall.com/p/mklvdw/install-phpunit-with-composer সুরকারের সাথে আপডেট করতে।


Answer #6
public function testException() {
    try {
        $this->methodThatThrowsException();
        $this->fail("Expected Exception has not been raised.");
    } catch (Exception $ex) {
        $this->assertEquals($ex->getMessage(), "Exception message");
    }

}

Answer #7

PHPUnit expectException পদ্ধতিটি খুবই অসুবিধার কারণ এটি পরীক্ষার পদ্ধতিতে শুধুমাত্র একটি ব্যতিক্রম পরীক্ষা করার অনুমতি দেয়।

আমি এই সহায়তাকারী ফাংশনটিকে কিছুটা ফাঁস করে দেওয়ার জন্য বলছি:

/**
 * Asserts that the given callback throws the given exception.
 *
 * @param string $expectClass The name of the expected exception class
 * @param callable $callback A callback which should throw the exception
 */
protected function assertException(string $expectClass, callable $callback)
{
    try {
        $callback();
    } catch (\Throwable $exception) {
        $this->assertInstanceOf($expectClass, $exception, 'An invalid exception was thrown');
        return;
    }

    $this->fail('No exception was thrown');
}

আপনার পরীক্ষার ক্লাসে যোগ করুন এবং এইভাবে কল করুন:

public function testSomething() {
    $this->assertException(\PDOException::class, function() {
        new \PDO('bad:param');
    });
    $this->assertException(\PDOException::class, function() {
        new \PDO('foo:bar');
    });
}

Answer #8

পিএইচপি ইউনাইটেড 5.7.27 এবং পিএইচপি 5.6 এবং এক পরীক্ষায় একাধিক ব্যতিক্রম পরীক্ষা করার জন্য, ব্যতিক্রম পরীক্ষাটি জোরদার করা গুরুত্বপূর্ণ ছিল। ব্যতিক্রম ব্যতিক্রমটি প্রয়োগ করার জন্য ব্যতিক্রম হ্যান্ডলিং ব্যবহার করে যদি ব্যতিক্রম হয় তবে পরিস্থিতিটি পরীক্ষা করা এড়িয়ে যাবে।

public function testSomeFunction() {

    $e=null;
    $targetClassObj= new TargetClass();
    try {
        $targetClassObj->doSomething();
    } catch ( \Exception $e ) {
    }
    $this->assertInstanceOf(\Exception::class,$e);
    $this->assertEquals('Some message',$e->getMessage());

    $e=null;
    try {
        $targetClassObj->doSomethingElse();
    } catch ( Exception $e ) {
    }
    $this->assertInstanceOf(\Exception::class,$e);
    $this->assertEquals('Another message',$e->getMessage());

}

Answer #9

এখানে আপনি ব্যতিক্রম করতে পারেন সব ব্যতিক্রম assertions। তাদের সব ঐচ্ছিক মনে রাখবেন।

class ExceptionTest extends PHPUnit_Framework_TestCase
{
    public function testException()
    {
        // make your exception assertions
        $this->expectException(InvalidArgumentException::class);
        // if you use namespaces:
        // $this->expectException('\Namespace\MyExceptio‌​n');
        $this->expectExceptionMessage('message');
        $this->expectExceptionMessageRegExp('/essage$/');
        $this->expectExceptionCode(123);
        // code that throws an exception
        throw new InvalidArgumentException('message', 123);
   }

   public function testAnotherException()
   {
        // repeat as needed
        $this->expectException(Exception::class);
        throw new Exception('Oh no!');
    }
}

ডকুমেন্টেশন here পাওয়া here


Answer #10

নীচের কোড ব্যতিক্রম বার্তা এবং ব্যতিক্রম কোড পরীক্ষা করবে।

গুরুত্বপূর্ণ: প্রত্যাশিত ব্যতিক্রমটিও নিক্ষেপ না হলে এটি ব্যর্থ হবে।

try{
    $test->methodWhichWillThrowException();//if this method not throw exception it must be fail too.
    $this->fail("Expected exception 1162011 not thrown");
}catch(MySpecificException $e){ //Not catching a generic Exception or the fail function is also catched
    $this->assertEquals(1162011, $e->getCode());
    $this->assertEquals("Exception Message", $e->getMessage());
}




assert