测试一个方法是否被调用

testing if a method is called

我正在尝试弄清楚如何正确测试函数是否被调用。

此函数 busqueda 是在控制器 AnuncioController 中定义的,因此我希望它在用户单击搜索按钮时被调用发布到 anuncios/busqueda.

就我而言,这可以通过模拟来完成。这是我试过的:

use \App\Http\Controllers;
class ExampleTest extends TestCase
{

   public function testBuscador()
   {
    $mock_buscador = Mockery::mock(\App\Http\Controllers\AnuncioController::class);
    $mock_buscador->shouldReceive('busqueda')->once()->andReturn(null);
    $this->visit('/')->submitForm('Buscar')->seePageIs('anuncios/busqueda');
   }

}

但是assert总是失败,我是不是用错了mocks?

错误消息:

PHPUnit 4.8.21 by Sebastian Bergmann and contributors.

....E

Time: 352 ms, Memory: 23.25Mb

There was 1 error:

1) ExampleTest::testBuscador Mockery\Exception\InvalidCountException: Method busqueda() from Mockery_0_App_Http_Controllers_AnuncioController should be called exactly 1 times but called 0 times.

/var/www/html/anuncios.com/vendor/mockery/mockery/library/Mockery/CountValidator/Exact.php:37 /var/www/html/anuncios.com/vendor/mockery/mockery/library/Mockery/Expectation.php:271 /var/www/html/anuncios.com/vendor/mockery/mockery/library/Mockery/ExpectationDirector.php:120 /var/www/html/anuncios.com/vendor/mockery/mockery/library/Mockery/Container.php:297 /var/www/html/anuncios.com/vendor/mockery/mockery/library/Mockery/Container.php:282 /var/www/html/anuncios.com/vendor/mockery/mockery/library/Mockery.php:142 /var/www/html/anuncios.com/tests/ExampleTest.php:19

FAILURES! Tests: 5, Assertions: 27, Errors: 1.

Routes.php片段:

Route::post('anuncios/busqueda', [
    'as' => 'anuncios/busqueda',
    'uses' => 'AnuncioController@busqueda',
]);

AnuncioController.php片段:

public function busqueda(Request $request)
{...}

尝试使用控制器的完整路径。

use \App\Http\Controllers;
class ExampleTest extends TestCase
{

   public function testSearch()
   {
        $mock_search = Mockery::mock(\App\Http\Controllers\AnuncioController::class);
        // or if you aren't using php 5
        // $mock_search = Mockery::mock('\App\Http\Controllers\AnuncioController');
        $mock_search->shouldReceive('busqueda')->once()->andReturn(null); 
        $this->visit('/')->submitForm('Buscar')->seePageIs('anuncios/busqueda');

   }
}

编辑

我会为你的控制器使用 Mockery。我会更多地将它用于 Facades。我会重写测试以测试您想在页面上看到的内容。

use \App\Http\Controllers;
class ExampleTest extends TestCase
{

   public function testSearch()
   {
        $this->visit('/')
          ->type('expected', 'search')
          ->submitForm('Buscar')
          ->seePageIs('anuncios/busqueda')->
          ->see('expected results');

   }
}

您创建了模拟对象 $mock_buscador 而没有实际使用它。似乎您希望 App\Http\Controllers\AnuncioController 的任何实例都被模拟替换,但事实并非如此。您需要将使用的控制器实例替换为 $mock_buscador 模拟对象。