Установить объект, установленный кодом в Mockery

У меня есть следующий код для тестирования.

// $generator, $locale, $site are parameters.
// It is just a part of real code.
$text = new Text();
$text->setType($generator->getType())
    ->setLocale($locale)
    ->setSite($site->getId());

/** @var $site \namespace\Site */
$site->addText($text);

Чтобы проверить это, я создаю имитацию сайта с помощью Mockery.

В тесте я обычно хочу сделать

$text = $site->getText();
$this->assertInstanceOF('\namespace\Text', $text);
$this->assertSame($generator->getType(), $text->getType());
$this->assertSame($locale, $text->getLocale());
$this->assertSame($site->getId(), $text->getSite());

При создании макета я хочу, чтобы макет возвращал экземпляр текста, созданный исходным кодом и установленный в строке $site->addText($site). Я пытался

$text = new Text();
$site = Mockery::mock(Site::class)
    ->shouldReceive('addText')
    ->with($text)
    ->andReturnUsing(function() {
            $args = func_get_args();
            return $args[0];
        })
    ->getMock();

Это вернет мне объект Text, установленный в насмешливом коде. В насмешку, есть ли способ создать текстовый объект в исходном коде?


person KD-Freelancer    schedule 21.04.2016    source источник


Ответы (1)


В этом случае вы можете использовать метод Mockery::on(). См. документы о проверке аргументов. Здесь вы можете передать закрытие, которое получает аргумент, переданный методу addText. Вы также можете использовать утверждения PHPUnit в этом закрытии, чтобы делать утверждения для параметра $text. Нравится:

$site = Mockery::mock(Site::class)
    ->shouldReceive('addText')
    ->with(Mockery::on(function($text) {
        $this->assertInstanceOF('\namespace\Text', $text);
        //More assertions

        return true; //You must return true, otherwise the expectation will never pass regardless of the assertions above.
    }));
person Bram Gerritsen    schedule 21.04.2016
comment
Спасибо @bram, у меня была аналогичная проблема, и решение, которое вы дали, кажется, лучше всего подходит для моей проблемы. - person Kapil Sharma; 22.04.2016