Heim >Backend-Entwicklung >PHP-Tutorial >Laravel-Tutorial: Verwenden von Stub zum Auflösen von Abhängigkeiten in Komponententests

Laravel-Tutorial: Verwenden von Stub zum Auflösen von Abhängigkeiten in Komponententests

巴扎黑
巴扎黑Original
2017-08-16 09:31:242087Durchsuche


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.

Abhängigkeiten in Laravel

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.

Als Beispiel

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.

Stubbing

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.

Stubs in Laravel verwenden

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 了呢?我们是不是就要重新计算数据了匹配断言了呢?这样的测试,可靠性便大大降低。

Postscript

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn