Aún no tienes acceso a esta clase

Crea una cuenta y continúa viendo este curso

Update y validación con TDD

32/36
Recursos

Aportes 36

Preguntas 1

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.

Para esta clase se hizo el test de update que consta de

  • Crear un post con factory
  • Actualizarlo mediante una peticion PUT, encontrandolo mediante su ID y enviando la key con el valor
  • Verificando estructura del json, valor y key, y status ok
  • Verificando el valor y la key en la DB

Pare nada más correr un sólo test en Laravel 8.x, podemos usar:
php artisan test --filter test_update

    public function update(PostRequest $request, Post $post)
    {
        $post->update($request->all());

        return response()->json($post);
    }
//test
    public function test_update_posts()
    {
        $post = factory(Post::class)->create();
        
        $response = $this->json('PUT', "/api/posts/$post->id", [
            'title' => 'Post editado'
        ]);

        $response->assertJsonStructure([
            'id', 'title', 'created_at', 'updated_at'
        ])
            ->assertJson(['title' => 'Post editado'])
            ->assertStatus(Response::HTTP_OK); //Ok, se ha creado un recurso

        $this->assertDatabaseHas(
            'posts',
            [
                'id' => $post->id,
                'title' => 'Post editado'
            ]
        );
    }

Test para cada método.
Se utiliza el parámetro --filter y el nombre del método, para enfocarnos en realizar la pruebas de un método específico.
php vendor/phpunit/phpunit/phpunit --filter test_update

PostControllerTest

    public function test_update()
    {
        // $this->withoutExceptionHandling();
        $post = factory(Post::class)->create();
        $response = $this->json('PUT', "/api/posts/$post->id", [
            'title' => 'nuevo'
        ]);

        $response->assertJsonStructure(['id', 'title', 'created_at', 'updated_at'])
            ->assertJson(['title' => 'nuevo'])
            ->assertStatus(200); // ok

        $this->assertDatabaseHas('posts', ['title' => 'nuevo']);
    }

PostController

    public function update(PostRequests $request, Post $post)
    {
        $post->update($request->all());

        return response()->json($post);
    }

La prueba de actualizar

public function test_update()
{
    $post = factory(Post::class)->create();

    $response = $this->json('PUT',"api/posts/$post->id",[
        'title' => 'nuevo'
    ]);

    $response->assertJsonStructure(['id','title','created_at','updated_at'])
    ->assertJson(['title' => 'nuevo'])
    ->assertStatus(200); 

    $this->assertDatabaseHas('posts',['title' => 'nuevo']);
}

#api

#test

public function test_404_show()
    {

        $response = $this->json('GET', '/api/posts/1000'); //id = 1000
        $response->assertStatus(404);

    }
    public function test_update()
    {
        $this->withoutExceptionHandling(); //PARA TESTING DETALLADO
        $post = factory(Post::class)->create();

        $response = $this->json('PUT',"/api/posts/$post->id",[
            'title' => 'nuevo'
        ]);

        $response->assertJsonStructure(['id','title','created_at','updated_at'])
            ->assertJson(['title' => 'nuevo'])
            ->assertStatus(200); //OK Y CREADO UN RECURSO : CODIGO 201
        

        $this->assertDatabaseHas('posts',['title' => 'nuevo']);
    }

Código de prueba método update =>

public function test_update()
    {
        //$this->withoutExceptionHandling();
        $post = Post::factory()->create();
        $response = $this->json('PUT',"/api/posts/$post->id",
            ['title' => 'Nuevo']
        );

        $response->assertJsonStructure(['id','title','created_at','updated_at'])
            ->assertJson(['title' => 'Nuevo'])
            ->assertStatus(200);// Ok.

        $this->assertDatabaseHas('posts', ['title' => 'Nuevo']);
    }

No se un gran aporte, pero si gustan tambien pueden utilizar el enrutador en lugar de las rutas directamente :0

   $response = $this->json('PUT', route("posts.update", [$post]),
            [
                'title' => 'new post'
            ]);

Laravel 8

    public function test_update()
    {
        $post = Post::factory()->create();

        $response = $this->json('PUT',"/api/posts/$post->id",[
            'title' => 'nuevo'
        ]);

        $response->assertJsonStructure(['id', 'title', 'created_at', 'updated_at'])
        ->assertJson(['title'=> 'nuevo'])
        ->assertStatus(200); // OK

        $this->assertDatabaseHas('posts',['title' => 'nuevo']);
    }

Controller Test:

/**
     * Feature for update a post test
     *
     */
    public function test_update()
    {
        $post = factory(Post::class)->create();

        $response = $this->json('PUT', "/api/posts/$post->id", [
            'title' => 'Nuevo'
        ]);

        $response->assertJsonStructure(['id', 'title', 'created_at', 'updated_at'])
                ->assertJson(['title' => 'Nuevo'])
                ->assertStatus(200); //OK

        $this->assertDatabaseHas('posts', ['title' => 'Nuevo']);
    }

Controller:

/**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \App\Post  $post
     * @return \Illuminate\Http\Response
     */
    public function update(PostRequests $request, Post $post)
    {
        $post->update($request->all());

        return response()->json($post, 200);
    }
< public function test_update()
    {
        $this->withoutExceptionHandling();

        $post = factory(Post::class)->create();

        $response = $this->json('PUT', "/api/posts/$post->id", [
            'title' => 'El post de edit'
        ]);

        $response->assertJsonStructure(['id', 'title', 'created_at', 'updated_at'])
        ->assertJson(['title' => 'El post de edit'])
        ->assertStatus(200); //OK, edit recurso

        $this->assertDatabaseHas('posts', ['title' => 'El post de edit']);
    }>

public function test_update()
{
$this->withoutExceptionHandling();

    $post = factory(Post::class)->create();

    $response = $this->json('PUT', "/api/posts/$post->id", [
        'title' => 'El post de edit'
    ]);

    $response->assertJsonStructure(['id', 'title', 'created_at', 'updated_at'])
    ->assertJson(['title' => 'El post de edit'])
    ->assertStatus(200); //OK, edit recurso

    $this->assertDatabaseHas('posts', ['title' => 'El post de edit']);
}

Buen día, mi duda es la siguiente:
El archivo de pruebas solicita un Json al controlador, pero que pasa en la vida real, los controller no devuelven un Json, devuelven una vista con información.
¿Hay algún tipo de pruebas que valide las vistas?

Listo el método Update, vamos por el método Delete. Ya me estoy acostumbrando al TDD.

public function update(PostRequests $request, Post $post)
    {
        $post->update($request->all());
        return response()->json($post);
    }```

Excelente clase genial

public function test_show()
    {
        $post = factory(Post::class)->create();

        $response = $this->json('GET', "api/posts/$post->id");

        $response->assertStatus(200)->assertJson(['id' => $post->id, 'title' => $post->title]);
    }
public function test_update()
    {
        // $this->withoutExceptionHandling();

        $post = factory(Post::class)->create();

        $response = $this->json('PUT', "api/posts/$post->id", [
            'title' => 'nuevo titulo'
        ]);

        $response->assertStatus(200)->assertJson(['title' => 'nuevo titulo']);

        $this->assertDatabaseHas('posts', ['title' => 'nuevo titulo']);
    }

PostControllerTest.php

public function test_update()
    {
        //$this->withoutExceptionHandling();

        $post = factory(Post::class)->create();

        $response = $this->json('PUT', "/api/posts/$post->id",[
            'title' => 'nuevo'
        ]);

        $response->assertJsonStructure(['id', 'title', 'created_at', 'updated_at'])
            ->assertJson(['title' => 'nuevo'])
            ->assertStatus(200); //OK

        $this->assertDatabaseHas('posts', ['title' => 'nuevo']);


    }

PostController.php

public function update(PostRequests $request, Post $post)
    {
        $post->update($request->all());

        return response()->json($post);
    }

saludos tengo un error que menciona que "Call to a member function update() on string "

por favor porque puede salir este error si el codigo esta igual y a que se refiere este error .

gracias por su ayuda

 public function test_update()
    {
        $this->withoutExceptionHandling();

        $post = factory(Post::class)->create();

        $response = $this->json('PUT', "/api/posts/$post->id",[
            'title' => 'nuevo'
        ]);

        $response->assertJsonStructure(['id', 'title', 'created_at', 'updated_at'])
            ->assertJson(['title' => 'nuevo'])
            ->assertStatus(200); //OK

        $this->assertDatabaseHas('posts', ['title' => 'nuevo']);


    }

todo va OK

public function test_update()
    {
        $post = factory(Post::class)->create();
        // para activar el manejador de errores, en caso de ser necesario
        // $this->withoutExceptionHandling();

        $response = $this->json('PUT',"api/posts/$post->id", [
            'title' => 'test update'
        ]);
        // varias comprobaciones
        $response->assertJsonStructure(['id', 'title', 'created_at', 'updated_at'])
            ->assertJson(['title' => 'test update'])
            ->assertStatus(200); // OK
        
        $this->assertDatabaseHas('posts', ['title' => 'test update']);
    }

Comparto mi código por si alguien le puede ayudar 😃

public function test_update()
{
  $this->withoutExceptionHandling();
  $post = factory(Post::class)->create(); 

  $response = $this->json('PUT', "/api/posts/$post->id", [
      'title' => 'Post actualizado'
  ]);

  $response->assertJsonStructure(['id','title', 'created_at', 'updated_at'])
  ->assertJson(['title'=> 'Post actualizado'])
  ->assertStatus(200);

  $this->assertDatabaseHas('posts', ['title'=> 'Post actualizado']);
}

Si agregan un script de Node de la siguiente manera:

"test": "sh vendor/bin/phpunit > phpunit.log"

Pueden ejecutar los test con npm test y ademas les guarda en la raíz un archivo con todo lo que sale en la terminal para poder trabajar mejor.

/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param \App\Post $post
* @return \Illuminate\Http\Response
*/
public function update(PostRequest $request, Post $post)
{
$post->update($request->all());

    return response()->json($post);
}

Mi codigo

/**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \App\Post  $post
     * @return \Illuminate\Http\Response
     */
    public function update(PostRequest $request, Post $post)
    {
        $post->update($request->all());

        return response()->json($post);
    }```
    public function test_update()
    {
        //Muestra los errores de las pruebas
        $this->withoutExceptionHandling();
        $post = Factory(Post::class)->create();

        $response = $this->json('PUT',"/api/posts/$post->id", [
            'title'=>'nuevo'
        ]); //id =1

        $response->assertJsonStructure(['id','title','created_at','updated_at'])
        ->assertJson(['title' => 'nuevo'])
        ->assertStatus(200);//OK 

        $this->assertDatabaseHas('posts',['title' => 'nuevo']);
    }

Copiar y pegar codigo en si es mala practica cuando por ejemplo se saca de internet y no se sabe como funciona. En lo personal tiendo a copiar mucho mi propio codigo por ejemplo al crear un nuevo modulo en alguna aplicación, y este es identico a uno que ya realice, copeo, pego y luego adapto el codigo.

Genial, dejo aquí mi método test_update() con mis comentarios explicandó por qué se pone tal cosa ahí:

public function test_update() {

        $post = Post::factory()->create();

        $response = $this->json("PUT", "/api/posts/$post->id", [
            "title" => "nuevo"
        ]);

        $response->assertJsonStructure(["id", "title", "created_at", "updated_at"])
            ->assertJson(["title" => "nuevo"]) // El json que me devuelve la respuestan tiene que tener el titulo con e valor de nuevo, eso significa que si se actualizo con elvalor que envié
            ->assertStatus(200); // Ok, creado un recurso

        // Como al actualizar también se tiene que guardar el valor en la base de datos, verifico que el valor guardado sea efectivamente el que actualicé
        $this->assertDatabaseHas("posts", ["title" => "nuevo"]);
        
    }

El ultimo test decidí resolverlo por mi cuenta y ayuda mucho comenzar a ponerse esos retos.

Excelente clase y catedratico

Cumpliendo:

public function update(PostRequest $request, Post $post)
    {
        $post->update($request->all());
        return response()->json($post);
    }
public function test_update()
    {
        // Linea para seguimiento de errores
        //$this->withoutExceptionHandling();

        $post = factory(Post::class)->create();

        // Cuando nos conectamos a una API nos manejamos con JSONs
        $response = $this->json('PUT', "/api/posts/$post->id", [
            'title' => 'Titulo editado'
        ]);

        $response->assertJsonStructure([
            'id',
            'title',
            'created_at',
            'updated_at'
        ])
            ->assertJson(['title' => 'Titulo editado'])
            ->assertStatus(200);

        $this->assertDatabaseHas('posts', ['title' => 'Titulo editado']);
    }

Mi código, estoy usando Laravel 8.X

Function test_update

public function test_update()
    {
        $this->withoutExceptionHandling();

        $post = Post::factory()->create();

        $response = $this->json('PUT', "api/posts/$post->id", [
            'title' =>  'nuevo'
        ]);

        $response->assertJsonStructure(["id", "title", "created_at","updated_at"])
        ->assertJson(["title" => 'nuevo'])
        ->assertStatus(200); //ok creado correctamente
        
        $this->assertDatabaseHas('posts', ['title' => 'nuevo']);
    }

Function update

public function update(PostRequest $request, Post $post)
    {
        $post->update($request->all());

        return response()->json($post);
    }