Zusammenfassung: Ich kenne das Konzept des Unit-Tests schon lange und habe es ausprobiert. Langsam hat sich mein Verständnis von Unit-Tests und PHPUnit verbessert klarer und beginnen Sie langsam mit dem Üben von Unit-Tests. Wie wir alle über Abhängigkeiten in Laravel wissen, verwendet Laravel IoC und somit sind die verschiedenen Module entkoppelt. Und genau aus diesem Grund...
Ich kenne das Konzept des Unit-Tests schon lange und habe es ausprobiert. Langsam wurde mein Verständnis von Unit-Tests und PHPUnit klarer , und ich begann langsam, Unit-Tests zu üben.
Wir alle wissen, dass Laravel IoC verwendet und somit die verschiedenen Module entkoppelt sind. Und genau deshalb wird es einfacher, wenn wir Unit-Tests in Laravel schreiben.
Betrachten Sie das folgende Szenario. Während der Entwicklung fügen wir möglicherweise ein Repository
zwischen dem Controller und dem Modell hinzu, um Daten zu verarbeiten. Dann wird unser Controller
von Respository
abhängen. Mithilfe des IoC von Laravel können wir ein Service Provider
definieren, um Respository
zentral in den Container zu injizieren.
Angenommen, wir haben jetzt ein Repository, das Produktinformationen aufzeichnet. Wir möchten bestimmte Produktinformationen im Controller abrufen und dann eine Geschäftslogik ausführen.
Class GoodRepository{ public function getGoodById($goodId) { // TODO: Get good by its id. } }class GoodController extends Controller{ public function show($id, GoodRepository $goodRepository) { // TODO: Do something with good info from that repository. } }// In route/api.phpRoute::get('/api/good/{id}', 'GoodController@show');// Create a RepositoriesServiceProvider in Provider/RepositoriesServiceProvider.php。// And inject the GoodRepository into Container.class RepositoriesServiceProvider extends ServiceProvider{ public function boot() { } public function register() { $this->app->singleton(GoodRepository::class); } }
Okay, wir können feststellen, dass GoodController
von GoodRepository
abhängt und GoodRepository
von den Daten in der Datenbank abhängt. Aber wenn wir Unit-Tests durchführen, hoffen wir, so wenige Abhängigkeiten wie möglich zu generieren. Daher sollten wir in der Lage sein wollen, die von GoodRepository
zurückgegebenen Daten zu kontrollieren.
In Laravel wird die Methode $this->get('/path/to/route');
zum Testen von HTTP-Anfragen bereitgestellt. Dieser Test wird zwangsläufig die gerade erwähnten Abhängigkeiten beinhalten. Wie wir dieses Abhängigkeitsproblem lösen können, können wir unseren Protagonisten fragen – Stubware.
Das Ersetzen eines Objekts durch ein Testdouble, das (optional) einen konfigurierten Rückgabewert zurückgibt, wird als Stubbing bezeichnet.
Dies ist die Erklärung aus der PHPUnit-Dokumentation. Mein Verständnis ist, dass der sogenannte Stub das Verhalten einer abhängigen Klasse simulieren soll, sodass das Verhalten dieses Verhaltens unter unserer eigenen Kontrolle liegt. In der obigen Situation hoffen wir beispielsweise, dass die GoodRepository
-Simulationsmethode getGoodById
denselben Wert wie die tatsächliche Rückgabestruktur zurückgibt, ohne auf externe Datenquellen angewiesen zu sein.
Wir haben den Service Provider
Singleton über GoodRepository
registriert. Wenn wir dann Unit-Tests schreiben, können wir den Stub definieren, registriert als GoodRepository
Singleton.
class GoodControllerTest extends TestCase{ public function testShow() { $data = []; // The data returns from GoodRepository::getGoodById. $stub = $this->createMock(GoodRepository::class); $stub->method('getGoodById')->will($this->returnValue($data)); $this->app->singleton(GoodRepository::class, function () use ($stub) { return $stub; }); $response = $this->get('/api/good/1'); // Some assertions. } }
我们通过在这里将桩件 $stub
用单例模式注册给了 Container
,在调用 $this->get('/api/good/1');
时原本在 Controller
中的 GoodRepository
依赖就变成了我们自定义的桩件 $stub
。我们将 $data
定义为和返回值相同的结构,注册到桩件中。这样,所有的数据都在我们可控的范围了。
如果我们在这里不使用桩件,而是直接依赖外部(数据库)中的数据,那么如果 id 为 1 的数据被删除了,我们是不是就要改成 2 了呢?我们是不是就要重新计算数据了匹配断言了呢?这样的测试,可靠性便大大降低。
Für jedes zuverlässige System sind Unit-Tests unerlässlich. Glücklicherweise stellt uns PHPUnit nützliche Unit-Tests zur Verfügung. Worüber in diesem Artikel gesprochen wird, ist nur ein Tropfen auf den heißen Stein von PHPUnit. Und ich selbst erforsche und übe langsam. Lassen Sie uns gemeinsam Mut machen.
Das obige ist der detaillierte Inhalt vonLaravel-Tutorial: Verwenden von Stub zum Auflösen von Abhängigkeiten in Komponententests. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!