Wie verspotte ich Objekte in PHP, damit sie mit dem Null-Coalescing-Operator (??) korrekt funktionieren?
Posted: 15 Jan 2025, 14:08
Ich versuche, einen PHPUnit-Test mit Mockery zu schreiben, und es treten immer wieder Probleme auf, wenn ich den Null-Koaleszenzoperator (??) mit verspotteten Eigenschaften verwende. Konkret, ?? scheint immer null zurückzugeben, was dazu führt, dass das ?? Operator, um auf den Standardwert zurückzugreifen, auch wenn die Eigenschaft korrekt simuliert wird und einen Wert zurückgibt.
Hier ist eine vereinfachte Version meines Setups:
Ausgabe:
Wenn ich $model->title direkt verwende, funktioniert es einwandfrei und gibt den simulierten Wert („Testseite“) zurück. Wenn ich jedoch versuche, $model->title ?? 'default', der Fallback ('default') wird immer zurückgegeben, als ob die Titeleigenschaft nicht existiert oder null ist.
Gibt es eine Möglichkeit, den Null-Koaleszenzoperator ( ??) funktionieren zuverlässig mit Mockery-Mocks in PHP?
Beachten Sie, dass ich PHP 8.2, phpUnit 10.5 mit Laravel 11.33.2 verwende
Hier ist eine vereinfachte Version meines Setups:
Code: Select all
public function testExample()
{
$model = Mockery::mock(Model::class)->shouldIgnoreMissing();
// Mocking a property
$model->shouldReceive('getAttribute')
->with('title')
->andReturn('Test Page');
$model->title = 'Test Page'; // I also tried this
$result = $this->doSomething($model);
$this->assertEquals('/test-page', $result);
}
public function doSomething($model): string
{
print_r([$model->title, $model->title ?? 'default']);
...
...
}
Code: Select all
Array
(
[0] => Test Page
[1] => default
}
Gibt es eine Möglichkeit, den Null-Koaleszenzoperator ( ??) funktionieren zuverlässig mit Mockery-Mocks in PHP?
Beachten Sie, dass ich PHP 8.2, phpUnit 10.5 mit Laravel 11.33.2 verwende