when I'm coding I see often stuff like this:
testMyMethod() {
....
$mockMyServiceB
->expects($this->once())
->method('myMethodA')
->with(myvalue1, myvalue2, myvalue3)
->willReturn($someMockResult);
$myServiceA = new ServiceA($mockMyServiceB)
$results = $myServiceA->something();
$this->assertEquals(['resultA', 'resultB'], results);
}
Not sure, but I think that as you write more and more tests, this make them to loose readability quickly and so easy. You just put too much info (expects mixed with returns). You need to understand for each test the order of the arguments, the expectations, order of execution, and return values....too much I think.
I was thinking to move the code to something where you just test the correct use of myMethodA, and later another test where you can focus only on results, like this:
testMyMethodUseServiceBCorrectly() {
....
// this time no WillReturn, just focus on how is used
$mockMyServiceB
->expects($this->once())
->method('myMethodA')
->with(myvalue1, myvalue2, myvalue3);
$myServiceA = new ServiceA($mockMyServiceB)
$myServiceA->something();
}
testMyMethodUseServiceResults() {
....
// this time no Expects() or With(), just focus on results
$mockMyServiceB
->method('myMethodA')
->willReturn(myvalue1, myvalue2, myvalue3);
$myServiceA = new ServiceA($mockMyServiceB)
$this->assertEquals(['resultA', 'resultB'], $myServiceA->something());
}
I think this makes clear what you are testing, and also produce smaller tests. But not sure if is also usual.....is a recommended practice?