No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Aplicando el principio de inversión de la dependencia - Parte II

15/16
Recursos

Aportes 22

Preguntas 0

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Hola, me parece que la explicación fue muy bien lograda con relación al principio en sí. Sin embargo, si es necesario una capacitación previa sobre la inyección de dependencia, cuáles son sus usos, conceptos básicos y demás, que permitan ir un poco más firme siguiendo el paso a paso del contexto del principio dentro del código.

Este principio requiere un curso de inyeccion de dependencias antes, me perdi completamente, pero es mi culpa.

Esta debería ser la parte II, la clase 15/16.

Mi aporte para la creación de la prueba unitaria Add:

Modifique el método Add en el StudentController:

La razón por la que modifique este método es porque en las pruebas unitarias no me recibía void, debía retornar algo.

    [HttpPost]
    public Student Add([FromBody] Student student)
    {
        studentRepository.Add(student);
        logbook.Add($"The Student {student.Fullname} have been added");
        return student;
    }

Cree el método Add en la prueba unitaria de la siguiente manera:

    [Fact]
    public void Add()
    {
        var LogbookMock = new Mock<ILogbook>();
        var stundentRepositoryMock = new Mock<IStudentRepository>();

        var studentController = new StudentController(stundentRepositoryMock.Object, LogbookMock.Object);

        var student = new Student(1, "Carlos Pérez", new List<double>() { 4, 6.5 });

        var resultAddStudents = studentController.Add(student);

        Assert.NotNull(resultAddStudents);
    }

Excelente clase! Muy buen ejemplo y muy bien explicado

El mejor curso sobre SOLID que he visto en mi vida, muchas gracias Profe.

Este video es: Aplicando el principio de inversión de la dependencia - Parte II

## Reto - Añadir pruebas para método add Mi estrategia fue verificar que lo que pretendemos que pase dentro de la acción `Add` esté pasando realmente, ya que esta no devuelve ningún resultado. \## Código ```c# [Fact] public void AddStudent() { var logbookMock = new Mock<ILogbook>(); var studentRepositoryMock = new Mock<IStudentRepository>(); var studentController = new StudentController(studentRepositoryMock.Object, logbookMock.Object); var student = new Student() { Id = 1, FullName = "John Doe", Grades = [10, 7] }; studentController.Add(student); studentRepositoryMock.Verify(repo => repo.Add(It.IsAny<Student>()), Times.Once); logbookMock.Verify(logbook => logbook.Add($"The Student {student.FullName} has been added"), Times.Once); } ```
en conclusión en vez de crear objetos dentro, desde afuera de la clase debes inyectar objetos abstractos
Excelente curso de SOLID, para el principio de inversión de la dependencia sería bueno tener mas ejemplos practicos ya que es el principio mas complejo.
Tuve que verlo 3 veces para poder entender.
Les recomiendo al full, el **Curso de Unit Testing con C# y .NET**, es super completo lo dicta el mismo profesor y les puede ser muy útil al momento de llegar hasta este punto del test.
Hola, dejo mi solución al problema y añado los diferentes scripts que modifiqué.using Microsoft.AspNetCore.Mvc;namespace DependencyInversion;using Xunit;using DependencyInversion.Controllers;using Moq;using DependencyInversion; namespace Api.Tests; public class StudentTest { // \[Fact] // public void GetStudent() // { // var studentController = new StudentController(); // var resultGetStudents = studentController.Get(); // Assert.NotNull(resultGetStudents); // Assert.Equal(3, resultGetStudents.Count()); // } \[Fact] public void GetStudent() { var LogbookMock = new Mock\<ILogbook>(); var stundentRepositoryMock = new Mock\<IStudentRepository>(); stundentRepositoryMock.Setup(p=> p.GetAll()) .Returns(new List\<Student>() { new Student(1, "Pepito Pérez", new List\<double>() { 3, 4.5 }), new Student(2, "Mariana Lopera", new List\<double>() { 4, 5 }), new Student(3, "José Molina", new List\<double>() { 2, 3 }) }); var studentController = new StudentController(stundentRepositoryMock.Object, LogbookMock.Object); var resultGetStudents = studentController.Get(); Assert.NotNull(resultGetStudents); Assert.Equal(3, resultGetStudents.Count()); } \[Fact] public void AddStudent() { var LogbookMock = new Mock\<ILogbook>(); var studentRepositoryMock = new Mock\<IStudentRepository>(); studentRepositoryMock.Setup(p=> p.GetAll()) .Returns(new List\<Student>() { new Student(1, "Pepito Pérez", new List\<double>() { 3, 4.5 }), new Student(2, "Mariana Lopera", new List\<double>() { 4, 5 }), new Student(3, "José Molina", new List\<double>() { 2, 3 }), new Student(4, "Aldhair Vera", new List\<double>() { 5,5 }) }); var studentController = new StudentController(studentRepositoryMock.Object, LogbookMock.Object); studentController.Add(new Student(4, "Aldhair Vera", new List\<double>() { 5,5 })); var resultGetStudents = studentController.Get(); Assert.NotNull(resultGetStudents); Assert.Equal(4, resultGetStudents.Count()); }} public class Student{ public int Id { get; set; } public string Fullname { get; set; } public List\<double> Grades { get; set; } public Student() { this.Fullname = string.Empty; this.Grades = new List\<double>(); } public Student(int id, string fullname, List\<double> grades) { this.Id = id; this.Fullname = fullname; this.Grades = grades; } public string ToString() { string content = $"Student: {this.Id} - {this.Fullname} - Grades: "; for (int i = 0; i < this.Grades.Count; i++) { content += $" {this.Grades\[i]}{((i >= this.Grades.Count - 1) ? "" : " - ")}"; } return content; }} namespace DependencyInversion.Controllers; \[ApiController, Route("student")]public class StudentController : ControllerBase{ IStudentRepository studentRepository; ILogbook logbook; public StudentController(IStudentRepository student, ILogbook log){ studentRepository = student; logbook = log; } \[HttpGet] public IEnumerable\<Student> Get() { logbook.Add($"returning student's list"); return studentRepository.GetAll(); } \[HttpPost] public void Add(\[FromBody]Student student) { studentRepository.Add(student); logbook.Add($"The Student {student.Fullname} have been added"); Console.WriteLine($"The Student {student.ToString()} have been added"); foreach(var st in studentRepository.GetAll()){ Console.WriteLine($"{st.ToString()}"); } }} ```js using Microsoft.AspNetCore.Mvc; namespace DependencyInversion.Controllers; [ApiController, Route("student")] public class StudentController : ControllerBase { IStudentRepository studentRepository; ILogbook logbook; public StudentController(IStudentRepository student, ILogbook log){ studentRepository = student; logbook = log; } [HttpGet] public IEnumerable<Student> Get() { logbook.Add($"returning student's list"); return studentRepository.GetAll(); } [HttpPost] public void Add([FromBody]Student student) { studentRepository.Add(student); logbook.Add($"The Student {student.Fullname} have been added"); Console.WriteLine($"The Student {student.ToString()} have been added"); foreach(var st in studentRepository.GetAll()){ Console.WriteLine($"{st.ToString()}"); } } } ``````js namespace DependencyInversion; public class Student { public int Id { get; set; } public string Fullname { get; set; } public List<double> Grades { get; set; } public Student() { this.Fullname = string.Empty; this.Grades = new List<double>(); } public Student(int id, string fullname, List<double> grades) { this.Id = id; this.Fullname = fullname; this.Grades = grades; } public string ToString() { string content = $"Student: {this.Id} - {this.Fullname} - Grades: "; for (int i = 0; i < this.Grades.Count; i++) { content += $" {this.Grades[i]}{((i >= this.Grades.Count - 1) ? "" : " - ")}"; } return content; } } ``````js using Xunit; using DependencyInversion.Controllers; using Moq; using DependencyInversion; namespace Api.Tests; public class StudentTest { // [Fact] // public void GetStudent() // { // var studentController = new StudentController(); // var resultGetStudents = studentController.Get(); // Assert.NotNull(resultGetStudents); // Assert.Equal(3, resultGetStudents.Count()); // } [Fact] public void GetStudent() { var LogbookMock = new Mock<ILogbook>(); var stundentRepositoryMock = new Mock<IStudentRepository>(); stundentRepositoryMock.Setup(p=> p.GetAll()) .Returns(new List<Student>() { new Student(1, "Pepito Pérez", new List<double>() { 3, 4.5 }), new Student(2, "Mariana Lopera", new List<double>() { 4, 5 }), new Student(3, "José Molina", new List<double>() { 2, 3 }) }); var studentController = new StudentController(stundentRepositoryMock.Object, LogbookMock.Object); var resultGetStudents = studentController.Get(); Assert.NotNull(resultGetStudents); Assert.Equal(3, resultGetStudents.Count()); } [Fact] public void AddStudent() { var LogbookMock = new Mock<ILogbook>(); var studentRepositoryMock = new Mock<IStudentRepository>(); studentRepositoryMock.Setup(p=> p.GetAll()) .Returns(new List<Student>() { new Student(1, "Pepito Pérez", new List<double>() { 3, 4.5 }), new Student(2, "Mariana Lopera", new List<double>() { 4, 5 }), new Student(3, "José Molina", new List<double>() { 2, 3 }), new Student(4, "Aldhair Vera", new List<double>() { 5,5 }) }); var studentController = new StudentController(studentRepositoryMock.Object, LogbookMock.Object); studentController.Add(new Student(4, "Aldhair Vera", new List<double>() { 5,5 })); var resultGetStudents = studentController.Get(); Assert.NotNull(resultGetStudents); Assert.Equal(4, resultGetStudents.Count()); } } ```
Sería ideal entender APIs y Tests antes de realizar este curso, sino se hace sumamente confuso lo explicado.
que buena forma de explicarla en ambas partes muy complejo el principio pero explicación entendible totalmente

Yo agregué una modificación al metodo Add para regresar algun valor

StudentController


    [HttpPost]
    public bool Add([FromBody] Student student)
    {
        try
        {
            studentRepository.Add(student);
            logbook.Add($"The Student {student.Fullname} have been added");
            return true;
        }
        catch
        {
            return false;
        }
    }

Y asi quedo mi unit test

    [Fact]
    public void AddStudent_Success()
    {
        var LogbookMock = new Mock<ILogbook>();
        var stundentRepositoryMock = new Mock<IStudentRepository>();

        var studentController = new StudentController(stundentRepositoryMock.Object, LogbookMock.Object);
        var student = new Student(3, "José Molina", new List<double>() { 2, 3 });
        var resultAddStudent = studentController.Add(student);

        Assert.True(resultAddStudent);
    }

En el archivo de StudentTest.cs igual tiene varios errores a lo que se descomento.

a mi me da error en la linea 10, 19 y 20 del archivo Program.cs de API

builder.Services.AddSwaggerGen();
    app.UseSwagger();
    app.UseSwaggerUI(options =>

StudentTest.cs con la nueva prueba:

using Xunit;
using DependencyInversion.Controllers;
using Moq;
using DependencyInversion;
using System.Collections.Generic;

namespace Api.Tests;

public class StudentTest 
{
    [Fact]
    public void GetStudent()
    {
        var LogbookMock = new Mock<ILogbook>();
        var stundentRepositoryMock = new Mock<IStudentRepository>();
        stundentRepositoryMock.Setup(p=> p.GetAll())
                                        .Returns(new List<Student>()
                                        {
                                            new Student(1, "Pepito Pérez", new List<double>() { 3, 4.5 }),
                                            new Student(2, "Mariana Lopera", new List<double>() { 4, 5 }),
                                            new Student(3, "José Molina", new List<double>() { 2, 3 })
                                        });
        var studentController = new StudentController(stundentRepositoryMock.Object, LogbookMock.Object);
        var resultGetStudents = studentController.Get();
        Assert.NotNull(resultGetStudents);
        Assert.Equal(3, resultGetStudents.Count());
    }

    [Fact]
    public void AddStudent_StudentAddedSuccessfully()
    {
        // Arrange
        var student = new Student(4, "John Doe", new List<double>() { 3.5, 4.0 });
        var studentRepository = new StudentRepository();

        // Act
        studentRepository.Add(student);
        var allStudents = studentRepository.GetAll();

        // Assert
        Assert.Contains(student, allStudents);
    }
}

Empesar con la clase 15 y continuar con la clase 14 para terminar con la clase 16
a la fecha: feb. 4/23