Uso un pattern pattern di repository e ho riscontrato un ostacolo durante la scrittura di un unit test per uno dei miei metodi. Sono abbastanza nuovo nello scrivere test di unità, quindi gradirei qualsiasi aiuto!
Diciamo che ho un metodo che crea un prodotto e usa setter per impostare i dati.
public function addProduct(array $data)
{
$new = $this->repository->make(); // returns new Product object
$new->setTitle($data['title']);
$new->setPrice($data['price']);
$new->setImage($data['image']);
$new->setStock($data['stock']);
return $this->repository->save($new); // returns bool
}
Ora, quando scrivo i test unitari per questo metodo, cosa dovrei effettivamente provare?
- Dovrei semplicemente controllare il tipo di reso e lasciarlo così?
- Devo prendere in giro il ritorno di
make()
e assicurarmi che tutti i setter siano stati eseguiti? - Devo prendere in giro solo
repository
e assicurarmi chemake()
esave()
siano stati eseguiti?
Inizialmente, ho deciso di andare con tutte e tre le opzioni. Tuttavia, la mia preoccupazione è venuta da quando ho iniziato l'opzione 2, scrivendo dei test per garantire che tutti i setter fossero eseguiti
L'unità dovrebbe davvero preoccuparsi se tutti i setter hanno corso? Cosa succede se aggiungo altri campi? Sembra che fare questo significherebbe che il più piccolo cambiamento potrebbe comportare il fallimento del test unitario quando il metodo esegue effettivamente come eseguito.
Questo è il modo in cui ho scritto finora il mio test unitario, ma non sono sicuro di quanto sia rigoroso
public function testAddProductAddsProductWithCorrectAttributes()
{
$newMock = Mockery::make(ProductInterface::class)
->shouldReceive('setTitle')
->withArgs(['Test title'])
->shouldReceive('setPrice')
->withArgs([10.99])
->shouldReceive('setImage')
->withArgs(['/foobar.jpg'])
->shouldReceive('setStock')
->withArgs(['In Stock']);
$repoMock = Mockery::make(RepositoryInterface::class)
->shouldReceive('make')
->andReturn($newMock)
->shouldReceive('save')
->withArgs([$newMock])
->andReturn(true);
$service = new Service($repoMock);
$add = $service->addProduct([
'title' => 'Test title',
'price' => 10.99,
'image' => '/foobar.jpg',
'stock' => 'In Stock'
]);
$this->assertTrue($add);
}