php - collection - laravel foreach array
Laravel 5-Usando burla para burlarse del modelo Eloquent (1)
De acuerdo, después de encontrar varias publicaciones de Jeffrey Way (el tipo detrás de Laracasts) que recomiendan a las personas que dejen de burlarse de los objetos elocuentes y, en su lugar, las utilizo en las bases de datos de memoria, probé ese enfoque. Pensé que esto podría ser muy útil para otros usuarios que tienen los mismos problemas en el futuro, así que lo explicaré a continuación.
En este momento he editado el archivo my ''config / database.php'' para admitir la opción de base de datos en memoria usando sqlite:
''sqlite'' => [
''driver'' => ''sqlite'',
''database'' => '':memory:'',
''prefix'' => '''',
],
Luego en la parte superior del archivo, verá la siguiente configuración:
''default'' => env(''DB_CONNECTION'', ''mysql''),
Esto puede seguir igual, significa que Laravel verificará sus variables .env para encontrar una ''DB_CONNECTION'' o bien usará mysql por defecto. Esto es probablemente lo que le gustaría hacer cuando ejecuta su aplicación como de costumbre. Sin embargo, con las pruebas, le gustaría anular esta configuración y establecer la configuración de la base de datos a ''sqlite'' temporalmente. Esto puede hacerse agregando la variable ''DB_CONNECTION'' a su archivo .env:
DB_CONNECTION=mysql
Finalmente, en su phpunit.xml, el archivo de configuración utilizado por Laravel para realizar instantáneamente las pruebas unitarias, debe indicar que al probar esta variable debe establecerse en ''sqlite'':
<env name="DB_CONNECTION" value="sqlite"/>
Ahora ha terminado y Laravel iniciará una base de datos invisible en memoria cada vez que vaya a realizar pruebas. No olvide agregar la siguiente línea a las pruebas que necesitan la base de datos.
use /Illuminate/Foundation/Testing/DatabaseMigrations;
Le dirá a Laravel que realice las migraciones de su base de datos antes de comenzar las pruebas, para que pueda usar las tablas como lo haría normalmente.
¡De esta manera me funciona a la perfección! Espero que puedan usarlo.
He estado buscando en internet pero no encuentro una respuesta a mi problema. He estado buceando en los controladores de prueba en Laravel usando PHPUnit y Mockery. Sin embargo, parece que no me burlo de mis modelos basados en Eloquent. Me las arreglé para burlar mi Auth :: usuario () de la misma manera, aunque esto no se usa en la prueba a continuación.
Función en AddressController que necesita ser probado:
public function edit($id)
{
$user = Auth::user();
$company = Company::where(''kvk'', $user->kvk)->first();
$address = Address::whereId($id)->first();
if(is_null($address)) {
return abort(404);
}
return view(''pages.address.update'')
->with(compact(''address''));
}
ControllerTest que contiene el método setUp y simulado
abstract class ControllerTest extends TestCase
{
/**
* @var /App/Http/Controllers/Controller
*/
protected $_controller;
public function setUp(){
parent::setUp();
$this->createApplication();
}
public function tearDown()
{
parent::tearDown();
Mockery::close();
}
protected function mock($class)
{
$mock = Mockery::mock($class);
$this->app->instance($class, $mock);
return $mock;
}
}
AddressControllerTest extendiendo ControllerTest
class AddressControllerTest extends ControllerTest
{
/**
* @var /App/Models/Address
*/
private $_address;
/**
* @var /App/Http/Controllers/AddressController
*/
protected $_controller;
public function setUp(){
parent::setUp();
$this->_controller = new AddressController();
$this->_address = factory(Address::class)->make();
}
public function testEdit404(){
$companyMock = $this->mock(Company::class);
$companyMock
->shouldReceive(''where'')
->with(''kvk'', Mockery::any())
->once();
->andReturn(factory(Company::class)->make([
''address_id'' => $this->_address->id
]));
$addressMock = $this->mock(Address::class);
$addressMock
->shouldReceive(''whereId'')
->with($this->_address->id)
->once();
->andReturn(null);
//First try to go to route with non existing address
$this->action(''GET'', ''AddressController@edit'', [''id'' => $this->_address->id]);
$this->assertResponseStatus(404);
}
}
El error que sigue arrojando es:
1) AddressControllerTest::testEdit404
Mockery/Exception/InvalidCountException: Method where("kvk", object(Mockery/Matcher/Any)) from Mockery_1_Genta_Models_Company should be called exactly 1 times but called 0 times.
Quizás alguien tiene una idea?