2016-04-21 1 views
2

У меня есть следующий код для тестирования.Установить объект, заданный кодом в 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, созданный в исходном коде?

ответ

2

В этом случае вы можете использовать метод Mockery::on(). См. argument validation docs. Здесь вы можете передать закрытие, которое получает аргумент, переданный методу 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. 
    })); 
+0

Спасибо @bram, у меня была бы аналогичная проблема, и решение, которое вы дали, кажется наилучшим образом подходит для моей проблемы. –

Смежные вопросы