php - registros - order by eloquent
Modelos de Laravel Eloquent burlándose: cómo configurar una propiedad pública con Mockery (8)
¿Intentaste hacer mocks parciales ? Puedes probar algo como (NO PROBADO):
$mock = Mockery::mock(''User[hasRole]'');
$mock->shouldReceive(''hasRole'')->once()->andReturn(true);
$mock->roles = 2;
$this->assertTrue(someTest($mock));
Quiero usar un objeto simulado (Mockery) en mi prueba PHPUnit. El objeto simulado debe tener ambos métodos públicos y algunas propiedades públicas establecidas. La clase es un modelo de Laravel Eloquent. Intenté esto:
$mock = Mockery::mock(''User'');
$mock->shouldReceive(''hasRole'')->once()->andReturn(true); //works fine
$mock->roles = 2; //how to do this? currently returns an error
$this->assertTrue(someTest($mock));
... pero establecer la propiedad pública devuelve este error:
BadMethodCallException: el método Mockery_0_User :: setAttribute () no existe en este objeto simulado
Este error no se devuelve cuando se burla de una clase simple, pero se devuelve cuando trato de burlarme de un modelo Eloquent. ¿Qué estoy haciendo mal?
Esta respuesta es un poco tarde pero espero que ayude a alguien. Actualmente puede establecer una propiedad estática en objetos Eloquent simulados utilizando la palabra clave ''alias'':
$mocked_model = Mockery::mock(''alias:Namespace/For/Model'');
$mocked_model->foo = ''bar'';
$this->assertEquals(''bar'', $mocked_model->foo);
Esto también es útil para burlarse de las clases de proveedores externos como algunos de los objetos Stripe.
Lea sobre las palabras clave ''alias'' y ''sobrecarga'': http://docs.mockery.io/en/latest/reference/startup_methods.html
Intentado esto? Debería cubrir tu problema.
https://github.com/padraic/mockery/blob/master/docs/11-MOCKING-PUBLIC-PROPERTIES.md
Yo diría implementar estos
protected $roles = array();
public function setRoles($roles)
{
$this->roles = $roles;
}
public function addRole($role)
{
$this->roles[] = $role;
}
Entonces puedes probar usando:
$mock = Mockery::mock(''User'');
$mock->shouldReceive(''hasRole'')->once()->andReturn(true);
$mock->addRole(2);
$this->assertTrue(someTest($mock));
Este ábside te da la oportunidad de prometer un formato cuando hagas un getRoles () que sería una matriz del objeto Role si realizas SOLO OOP, o si prefieres usar una matriz, al menos sabes que siempre es una matriz que obtienes.
Mock parcial en Laravel 5.3
$mock = Mockery::mock(App/User::class)->makePartial();
$mock->shouldReceive(''hasRole'')->once()->andReturn(true);
$mock->roles = 2;
$this->assertEquals(2, $mock->roles);
Para responder a tu pregunta, también puedes probar algo como esto:
$mock = Mockery::mock(''User'');
$mock->shouldReceive(''hasRole'')->once()->andReturn(true); //works fine
$mock->shouldReceive(''setAttribute'')->passthru();
$mock->roles = 2;
$mock->shouldReceive(''getAttribute'')->passthru();
$this->assertEquals(2, $mock->roles);
O, según lo sugerido por seblaze, use un simulacro parcial:
$mock = Mockery::mock(''User[hasRole]'');
$mock->shouldReceive(''hasRole'')->once()->andReturn(true);
$mock->roles = 2;
$this->assertEquals(2, $mock->roles);
Pero, a partir de su fragmento de código, si está escribiendo pruebas unitarias, en realidad solo debe hacer una aserción por cada prueba:
function test_someFunctionWhichCallsHasRole_CallsHasRole() {
$mock = Mockery::mock(''User'');
$mock->shouldReceive(''hasRole'')->once();
$mock->someFunctionWhichCallsHasRole();
}
function test_someFunctionWhichCallsHasRole_hasRoleReturnsTrue_ReturnsTrue() {
$mock = Mockery::mock(''User'');
$mock->shouldReceive(''hasRole'')->once()->andReturn(true);
$result = $mock->someFunctionWhichCallsHasRole();
$this->assertTrue($result);
}
Puedes usar stdclass en este caso.
$obj = new stdClass();
$obj->roles = 2;
$mock = Mockery::mock(''User'');
// return stdclass here.
$mock->shouldReceive(''hasRole'')->once()->andReturn($obj);
$mock->roles = 2;
$this->assertEquals(2, $mock->roles);
Si desea obtener esta propiedad con este valor, solo úselo:
$mock ->shouldReceive(''getAttribute'')
->with(''role'')
->andReturn(2);
Si llama a $user->role
obtendrá - 2
( $user
- su clase simulada de User
)
Spy es tu amigo en esto:
$mock = Mockery::spy(''User'');
$mock->shouldReceive(''hasRole'')->once()->andReturn(true);
$mock->roles = 2;
$this->assertTrue(someTest($mock));