测试一个方法是否被调用
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
模拟对象。
我正在尝试弄清楚如何正确测试函数是否被调用。
此函数 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
模拟对象。