Maison  >  Questions et réponses  >  le corps du texte

Comment déplacer la fonction de fermeture vers la fonction normale

<p> <p>目前,我有一些标准测试:</p> <pre class="brush:php;toolbar:false;">test('peut obtenir le dernier abonnement des abonnés', function () { $this->seed(PlansTestSeeder::class); $this->seed(SubscriptionsTestSeeder::class); $this->assertDatabaseCount('plans', 2); $this->assertDatabaseCount('abonnements', 0); Abonnement ::factory()->create([ "plan_id" => Plan::where("slug", "bronze")->first()->id ]); Abonnement ::factory()->create([ "plan_id" => Plan::where("slug", "silver")->first()->id ]); Abonnement ::factory()->create([ "plan_id" => Plan::where("slug", "silver")->first()->id, "statut" => "expiré" ]); Abonnement ::factory()->trashed()->create(); $this->assertDatabaseCount('abonnements', 4); }); test('peut obtenir des abonnements actifs aux abonnés', function() { $this->seed(PlansTestSeeder::class); $this->seed(SubscriptionsTestSeeder::class); $silverPlan = Plan::where("slug", "silver")->first(); $abonnement1 = Abonnement::factory()->create([ "plan_id" => Plan::where("slug", "silver")->first()->id, "ID_abonné" => 1, "type_d'abonné" => "ApresourcingFrameworkBillingTestsModelsSubscriber", "créé_à" => maintenant()->sous-jours(2), "commencé_à" => maintenant()->sous-jours(2) ]); $abonnement2 = Abonnement::factory()->create([ "plan_id" => $silverPlan->id, "ID_abonné" => 1, "type_d'abonné" => "ApresourcingFrameworkBillingTestsModelsSubscriber", "créé_à" => maintenant()->sous-jours(1), "commencé_à" => maintenant()->sous-jours(1) ]); $user = Abonné::find(1); $abonnement = $user->latestSubscription(); attendre($abonnement->id)->toBe($abonnement2->id); });</pré> <p></p> <p>Ce que je veux faire, c'est le changer en quelque chose comme ceci : </p> <pre class="brush:php;toolbar:false;">test('peut obtenir le dernier abonnement des abonnés', getLatestSubscription()); test('peut obtenir des abonnements actifs aux abonnés', getActiveSubscriptions()); fonction getLatestSubscription() { /// code de fonction ici }); fonction getActiveSubscriptions() { // code de fonction ici });</pré> <p>Cependant, la fonction test contient une référence à $this qui est disponible dans la fermeture normale mais pas dans la fonction standard car je l'y ai définie. </p> <p>Edit : j'utilise le plugin laravel pest - je ne sais pas si cela a un impact sur l'utilisation de $this</p> <p>Existe-t-il un moyen de résoudre ce problème ? </p>
P粉831310404P粉831310404433 Il y a quelques jours568

répondre à tous(1)je répondrai

  • P粉563446579

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

    Merci pour quelques conseils dans les réponses. Pas aussi soigné que je l'espérais, mais au moins cela signifie que tous les appels de test (« description du test ») se trouvent au même endroit au bas du fichier 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);
    });

    répondre
    0
  • Annulerrépondre