Heim  >  Fragen und Antworten  >  Hauptteil

So verschieben Sie die Funktion von der Schließung zur normalen Funktion

<p>我正在尝试使害虫测试文件更易于阅读.</p> <p>目前,我有一些标准测试:</p> <pre class="brush:php;toolbar:false;">test('kann das neueste Abonnement für Abonnenten abrufen', function () { $this->seed(PlansTestSeeder::class); $this->seed(SubscriptionsTestSeeder::class); $this->assertDatabaseCount('pläne', 2); $this->assertDatabaseCount('subscriptions', 0); Subscription::factory()->create([ "plan_id" => Plan::where("slug", "bronze")->first()->id ]); Subscription::factory()->create([ "plan_id" => Plan::where("slug", "silver")->first()->id ]); Subscription::factory()->create([ "plan_id" => Plan::where("slug", "silver")->first()->id, "Status" => "abgelaufen" ]); Subscription::factory()->trashed()->create(); $this->assertDatabaseCount('subscriptions', 4); }); test('kann Abonnenten aktive Abonnements erhalten', function () { $this->seed(PlansTestSeeder::class); $this->seed(SubscriptionsTestSeeder::class); $silverPlan = Plan::where("slug", "silver")->first(); $subscription1 = Subscription::factory()->create([ "plan_id" => Plan::where("slug", "silver")->first()->id, "Abonnenten-ID" => 1, "subscriber_type" => „ApresourcingFrameworkBillingTestsModelsSubscriber“, "erstellt_at" => now()->subDays(2), "gestartet um" => now()->subDays(2) ]); $subscription2 = Subscription::factory()->create([ "plan_id" => $silverPlan->id, "Abonnenten-ID" => 1, "subscriber_type" => „ApresourcingFrameworkBillingTestsModelsSubscriber“, "erstellt_at" => now()->subDays(1), "gestartet um" => now()->subDays(1) ]); $user = Subscriber::find(1); $subscription = $user->latestSubscription(); erwarten($subscription->id)->toBe($subscription2->id); });</pre> <p></p> <p>Was ich tun möchte, ist, es in etwa so zu ändern: </p> <pre class="brush:php;toolbar:false;">test('kann das neueste Abonnement für Abonnenten abrufen', getLatestSubscription()); test('kann Abonnenten aktive Abonnements erhalten', getActiveSubscriptions()); Funktion getLatestSubscription() { /// Funktionscode hier }); Funktion getActiveSubscriptions() { // Funktionscode hier });</pre> <p>Allerdings enthält die Testfunktion einen Verweis auf $this, der im normalen Abschluss verfügbar ist, aber nicht in der Standardfunktion, weil ich ihn dort gesetzt habe. </p> <p>Bearbeiten: Ich verwende das Laravel-Pest-Plugin – ich bin mir nicht sicher, ob dies Auswirkungen auf die Verwendung von $this</p> hat. <p>Gibt es eine Möglichkeit, dieses Problem zu lösen? </p>
P粉831310404P粉831310404433 Tage vor569

Antworte allen(1)Ich werde antworten

  • P粉563446579

    P粉5634465792023-09-06 21:24:29

    感谢回复中的一些提示。不像我希望的那样整洁,但至少这意味着所有测试(“测试描述”)调用都位于 php 文件底部的一个位置。

    $createSubscription = function () {
    
        $this->seed(PlansTestSeeder::class);
        $this->seed(SubscriptionsTestSeeder::class);
    
        $this->assertDatabaseCount('plans', 2);
        $this->assertDatabaseCount('subscriptions', 0);
    
    
        Subscription::factory()->create([
            "plan_id" => Plan::where("slug", "bronze")->first()->id
        ]);
        Subscription::factory()->create([
            "plan_id" => Plan::where("slug", "silver")->first()->id
        ]);
        Subscription::factory()->create([
            "plan_id" => Plan::where("slug", "silver")->first()->id,
            "status"  => "expired"
        ]);
        Subscription::factory()->trashed()->create();
    
        $this->assertDatabaseCount('subscriptions', 4);
    
    };
    
    $createBronzeSubscription = function () {
        $this->seed(PlansTestSeeder::class);
        $this->seed(SubscriptionsTestSeeder::class);
    
        Subscription::factory()->create([
            "plan_id" => Plan::where("slug", "bronze")->first()->id
        ]);
    
        $this->assertDatabaseCount('subscriptions', 1);
    };
    
    
    test('can create subscription', function () use ($createSubscription) {
        return \Closure::bind(\Closure::fromCallable($createSubscription), $this, get_class($this))($this);
    });
    
    test('can create bronze subscription', function () use ($createBronzeSubscription) {
        return \Closure::bind(\Closure::fromCallable($createBronzeSubscription), $this, get_class($this))($this);
    });

    Antwort
    0
  • StornierenAntwort