PHPUnit: bu diziyi doğrulanıyor verilen değerin bir anahtara sahip

3 Cevap php

Aşağıdaki sınıf göz önüne alındığında:

<?php
class Example {
    private $Other;

    public function __construct ($Other)
    {
        $this->Other = $Other;
    }

    public function query ()
    {   
        $params = array(
            'key1' => 'Value 1'
            , 'key2' => 'Value 2'
        );

        $this->Other->post($params);
    }
}

Ve bu testcase:

<?php
require_once 'Example.php';
require_once 'PHPUnit/Framework.php';

class ExampleTest extends PHPUnit_Framework_TestCase {

    public function test_query_key1_value ()
    {   
        $Mock = $this->getMock('Other', array('post'));

        $Mock->expects($this->once())
              ->method('post')
              ->with(YOUR_IDEA_HERE);

        $Example = new Example($Mock);
        $Example->query();
    }

Nasıl $params doğrularım (ki bir dizidir) ve $Other->post() 'Değer 1' bir değeri vardır 'anahtarı1' adında bir anahtar içerir geçirilir?

Ben dizinin tüm doğrulamak istemiyorum - bu sadece bir örnek kod, gerçek kod geçirilen dizi daha bir çok değerler var, ben orada sadece tek bir anahtar / değer çiftini doğrulamak istiyorum.

Orada $this->arrayHasKey('keyname') Ben anahtarının varolduğunu doğrulamak için kullanabilirsiniz.

Bu dizi değerine sahip olduğunu doğrulamak için kullanılabilecek, $this->contains('Value 1') bulunmaktadır.

Ben bile $this->logicalAnd ile iki birleştirmek olabilir. Ama tabii bu istenilen sonucu vermez.

Şimdiye kadar, returnCallback kullanarak bütün $ params yakalama ve daha sonra yapıyor asserts bu konuda, ama ne istediğinizi yapmak için başka bir yolu belki de var olmuştur?

3 Cevap

Ben özniteliği tek dayanarak, benim kendi kısıt sınıf oluşturarak sona erdi

<?php
class Test_Constraint_ArrayHas extends PHPUnit_Framework_Constraint
{
    protected $arrayKey;

    protected $constraint;

    protected $value;

    /**
     * @param PHPUnit_Framework_Constraint $constraint
     * @param string                       $arrayKey
     */
    public function __construct(PHPUnit_Framework_Constraint $constraint, $arrayKey)
    {
        $this->constraint  = $constraint;
        $this->arrayKey    = $arrayKey;
    }


    /**
     * Evaluates the constraint for parameter $other. Returns TRUE if the
     * constraint is met, FALSE otherwise.
     *
     * @param mixed $other Value or object to evaluate.
     * @return bool
     */
    public function evaluate($other)
    {
        if (!array_key_exists($this->arrayKey, $other)) {
            return false;
        }

        $this->value = $other[$this->arrayKey];

        return $this->constraint->evaluate($other[$this->arrayKey]);
    }

    /**
     * @param   mixed   $other The value passed to evaluate() which failed the
     *                         constraint check.
     * @param   string  $description A string with extra description of what was
     *                               going on while the evaluation failed.
     * @param   boolean $not Flag to indicate negation.
     * @throws  PHPUnit_Framework_ExpectationFailedException
     */
    public function fail($other, $description, $not = FALSE)
    {
        parent::fail($other[$this->arrayKey], $description, $not);
    }


    /**
     * Returns a string representation of the constraint.
     *
     * @return string
     */
    public function toString ()
    {
        return 'the value of key "' . $this->arrayKey . '"(' . $this->value . ') ' .  $this->constraint->toString();
    }


    /**
     * Counts the number of constraint elements.
     *
     * @return integer
     */
    public function count ()
    {
        return count($this->constraint) + 1;
    }


    protected function customFailureDescription ($other, $description, $not)
    {
        return sprintf('Failed asserting that %s.', $this->toString());
    }

Bu gibi kullanılabilir:

 ... ->with(new Test_Constraint_ArrayHas($this->equalTo($value), $key));

Yeniden kullanılabilir bir kısıtlama sınıf oluşturma yerine, ben PHPUnit mevcut arama kısıtlama kullanarak bir dizi anahtarının değeri savunmak için başardı. (Kimse meraklı ise, MongoCollection::ensureIndex()) Benim kullanım durumunda, ben bir alay yöntemine ikinci argüman bir dizi değeri için kontrol etmek gerekli. Burada ben ile geldi ne:

$mockedObject->expects($this->once())
    ->method('mockedMethod')
    ->with($this->anything(), $this->callback(function($o) {
        return isset($o['timeout']) && $o['timeout'] === 10000;
    }));

callback constraint onun kurucu bir çağrılabilir beklediğini ve sadece değerlendirilmesi sırasında çağırır. Iddia geçer ya dayanan başarısız çağrılabilir döner doğru veya yanlış olsun.

Büyük bir proje için, ben kesinlikle (yukarıdaki çözüm gibi) yeniden kullanılabilir bir kısıtlama oluşturmak veya PR #312 PHPUnit birleştirilecek için dilekçe tavsiye ederim, ama bu bir kerelik ihtiyacı için hile yaptı . Bu arama kısıtlama, çok daha karmaşık iddialar için nasıl yararlı olabileceklerini görmek kolaydır.

Üzgünüm, İngilizce bir konuşmacı değilim.

Ben bir anahtar array_key_exists fonksiyonu ile dizide varsa test düşünüyorum, ve değer array_search ile varsa test edebilirsiniz

Örneğin:

function checkKeyAndValueExists($key,$value,$arr){
    return array_key_exists($key, $arr) && array_search($value,$arr)!==false;
}

Array_search varsa bu değerin anahtarını iade çünkü !== kullanın ve 0 olabilir.