Bonjour,

Voila je rencontre un petit problème avec mon code.

Ce que je fais

Je suis entraine de faire un teste unitaire pour tester la collecte d'informations sur un utilisateurs. Dans ce test je teste si il y a un attribute "ip_md5" et email_md5 dans l'objet App/User

public function testMd5Informations()
    {
        $user = factory(User::class)->create();
        $response = $this->call('GET','/profil/',['name' => $user->name])

        $this->assertObjectHasAttribute('email_md5', $user);
        $this->assertObjectHasAttribute('ip_md5', $user);
    }

Ce que je veux

Le leste passse au succès. J'ai ajouter ceci dans ma classe App/User

protected $appends = ['email_md5', 'ip_md5'];

// Getters
    public function getEmailMd5Attribute(){
        return md5($this->attributes['email']);
    }

    public function getIpMd5Attribute(){
        return md5($this->attributes['ip']);
    }

Ce que j'obtiens

Le teste à échoué même avec les attributes email_md5 et ip_md5
1) Tests\Feature\UsersTest::testMd5Informations
Failed asserting that object of class "App\User" has attribute "email_md5".

C'est vraiment étrange

6 réponses


lakamark
Auteur
Réponse acceptée

J'ai trouvé la solution la variable $appends n'est disponible que sur des tableau ou des json. Je doir mondifier mon teste. Merci Kndeye de ton aide,

Salut, essai de faire un dd($user) avant la vérification sur le test et regarde si le user a vraiment les attributs que tu attends

lakamark
Auteur

Salut
J'ai fait un dd($user)

ça me donne ça :

App\User {#971
  #fillable: array:4 [
    0 => "name"
    1 => "email"
    2 => "password"
    3 => "confirmation_token"
  ]
  #hidden: array:4 [
    0 => "password"
    1 => "remember_token"
    2 => "email"
    3 => "ip"
  ]
  #appends: array:2 [
    0 => "email_md5"
    1 => "ip_md5"
  ]
  #connection: null
  #table: null
  #primaryKey: "id"
  #keyType: "int"
  +incrementing: true
  #with: []
  #perPage: 15
  +exists: true
  +wasRecentlyCreated: true
  #attributes: array:9 [
    "name" => "D'angelo McLaughlin I"
    "email" => "fschaefer@example.com"
    "password" => "$2y$10$dUiovOZ84GaCOUS5cyVC8uP.ZB2g5SATeaVcNFCoIA2lX2IMrDwma"
    "remember_token" => "9w0IGk6zSu"
    "role" => "user"
    "ip" => "97.147.67.175"
    "updated_at" => "2017-02-13 18:44:53"
    "created_at" => "2017-02-13 18:44:53"
    "id" => 1
  ]
  #original: array:9 [
    "name" => "D'angelo McLaughlin I"
    "email" => "fschaefer@example.com"
    "password" => "$2y$10$dUiovOZ84GaCOUS5cyVC8uP.ZB2g5SATeaVcNFCoIA2lX2IMrDwma"
    "remember_token" => "9w0IGk6zSu"
    "role" => "user"
    "ip" => "97.147.67.175"
    "updated_at" => "2017-02-13 18:44:53"
    "created_at" => "2017-02-13 18:44:53"
    "id" => 1
  ]
  #casts: []
  #dates: []
  #dateFormat: null
  #events: []
  #observables: []
  #relations: []
  #touches: []
  +timestamps: true
  #visible: []
  #guarded: array:1 [
    0 => "*"
  ]
  #rememberTokenName: "remember_token"

Étrangement je vois bien les attributes email_md5 et ip_md5, mais le teste ne les détecte pas et il continue à achoué alors que normalement il doit réussir car j'ai créer des getters dans mon model User

Désolé de te dire que tes attributs email_md5 et ip_md5 ne sont pas ajoutés aux attributs accessibles, essais de les ajouter sur le tableau des fillable dans ton model

$fillable = ['email_md5', 'ip_md5', .....]
lakamark
Auteur

Bonjour,
les champs email_md5 et ip_md5 sond des champs virtuelles. Il n'existe pas dans ma basse de donnée. Cest attributs sont dans le tableau appends de mon objet. Est-ce que ce peut le tableau $appends n'est disponible que losrque je fait un requête en format json pour une api Rest? J'ai bien ajouté au champs $fillable et le test échoué toujours.

Ce fut un plaisir