Bu işlev PHP öldürmek gerekiyordu olmadığını nasıl bir işlevi sınamak için phpunit kullanabilirim?

5 Cevap php

Esasen ben bir HTTP yönlendirmesi göndermek ve daha sonra PHP öldürmek için tasarlanmıştır killProgram adında bir sınıf, bir yöntem var.

Bunu nasıl test etmek gerekiyor? Ben phpunit çalıştırdığınızda bu test için bir şey dönmek ve tamamen kapanır değildir.

Şu anda ben killProgram işlevi bana bir istisna atıldı iddia sağlayacak ele almak gereken bir istisna atmak zorunda düşünüyorum.

Daha iyi bir yolu var mı?

5 Cevap

Her testler aynı PHPUnit işlemi tarafından işletilmektedir olarak çıkış kullanırsanız, / PHP kodu ölmek, her şeyi öldürecek - Fark olarak ^ ^

, Dönen yerine ölüyor gibi - Yani, evet, başka bir çözüm bulmak zorunda veya bir istisna atma (you can test if some tested code has thrown an expected exception).

Belki PHPUnit 3.4 ve --process-isolation switch (bkz. Optionally execute each test using a separate PHP process) might help (by not having everything dying), ama yine de elde etmek mümkün olmaz Testin sonucu, PHPUnit denetimi geri almazsa.

I've had this problem a couple of times ; solved it by returning instead of dying -- even returning several times, if needed, to go back "high enough" in the call stack ^^
In the end, I suppose I don't have any "die" anymore in my application... It's probably better, when thinking about MVC, btw.

Sadece, sadece set_exit_overload() (PHPUnit aynı yazarın test_helpers tarafından sağlanan) kullanabilirsiniz test edebilmek için kodunu değiştirmek için gerek yok.

Ben zaten bunun için bir yanıt kabul ettik ve eski bir soru farkındayım, ama bu biri için yararlı olabilir anlamaya, bu yüzden buraya:

Bunun yerine die(), ayrıca (farklı şekilde de olsa) program yürütme durdurmak ve PHPUnit en {[(kullanılacak olan throw new RuntimeException() (ya da kendi bir istisna sınıfı) kullanabilirsiniz kullanarak 2)]} yakalamak için. Size komut istiyorsanız bu durum kullanıcı düzeyinde hiçbir şey kadar baskı, karşılaşıldığında die(), set_exception_handler() bir göz atın.

Özellikle, sana set_exception_handler() testler kullanmak olmayan bir önyükleme dosyasına-call yer alacağı bir senaryo düşünüyorum, bu yüzden işleyici nedenle, ne olursa olsun senaryo orada ateş olmaz hiçbir şey phpunit yerli istisna işleme ile müdahale.

Bu tabii ki, eski bir soru ama benim önerim daha sonra taklit ayrı bir yönteme die() 'nin kodunu taşımak olacaktır.

As an example, instead of having this:

class SomeClass
{
    public function do()
    {
        exit(1);
        // or
        die('Message');
    }
}

Bu do:

class SomeClass
{
    public function do()
    {
        $this->terminate(123);
        // or
        $this->terminate('Message');
    }

    protected function terminate($code = 0)
    {
        exit($code);
    }

    // or 
    protected function terminate($message = '')
    {
        die($message);
    }
}

Bu şekilde kolayca terminate yöntemini taklit edebilir ve komut onu yakalamak mümkün olmadan sonlandırma konusunda endişelenmenize gerek yok.

Test, bu gibi bir şey olacaktır:

class SomeClassTest extends \PHPUnit_Framework_TestCase
{

    /**
     * @expectedExceptionCode 123
     */
    public function testDoFail()
    {
        $mock = $this->getMock('SomeClass');
        $mock->expects($this->any())
             ->method('terminate')
             ->will($this->returnCallback(function($code) {
                 throw new \Exception($code);
             }));

        // run to fail
        $mock->do();
    }
}

Ben kodu test değil ama bir çalışma durumuna oldukça yakın olmalıdır.

Bu bir testi geçmek için bazı eski kodu alıyorum sahip oldum konularda ayarlamak ilgilidir. Yani böyle bir Test edilebilir sınıf ile geldim ...

class Testable {
   static function exitphp() {
      if (defined('UNIT_TESTING')) {
         throw new TestingPhpExitException();
      } else {
         exit();
      }
   }
}

Şimdi sadece) Test edilebilir () ile çıkmak için :: exitphp (çağrıları değiştirin.

Test altında buysa ben sadece üretim Bilmiyorum, UNIT_TESTING tanımlar. Basit bir Mock gibi görünüyor.