This is a viewer only at the moment see the article on how this works.
To update the preview hit Ctrl-Alt-R (or ⌘-Alt-R on Mac) or Enter to refresh. The Save icon lets you save the markdown file to disk
This is a preview from the server running through my markdig pipeline
(SimpleM SK1 Unidad Testing La Parte de Blog 1 SSK3 Servicios
Sunday, 25 August 2024
El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer.
En este post I' empezaré a añadir unidad de prueba para este sitioM SK1 Esto va a ser' no un tutorial completo sobre unidad testing , sino más bien una serie de mensajes sobre cómo ISSK4m añadir unité testing a este sitio. En este post he probado algunos servicios mocking DbContext; esto es para evitar cualquier Shennanigans específico de DB.
Por qué la prueba de unidad?
La prueba de unidad es una manera de probar los componentes individuales del código de forma independiente. Esto resulta útil por varias razones:
- Isolará cada componente de su código haciendo que sea fácil ver cualquier problema en áreas específicas.
- Es una forma de documentar su código. Si tiene un test que falla, sabe que algo ha cambiado en ese área del código.
¿Qué otros tipos de pruebas existen?
Hay un número de otros tipos de pruebas que usted puede hacer. Aquí hay algunos:
- Integración Testing - Testing how different components of your code work togetherM SK1 En ASP.NET podríamos usar herramientas como El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. para comprobar la salida de los puntos finales y compararlos con los resultados esperados. NosotrosM SK1Añadiremos esto en el futuro.
- Esto puede hacerse con herramientas como: El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer..
- Evaluación del rendimiento - Evaluar cómo funciona su aplicación bajo carga. Esto se puede hacer con herramientas como Apache JMeter, En la misma sesión, el Consejo aprobó el proyecto de resolución A/C.2/57/L.20 sin someterlo a votación (véase párr.. Mi opción preferida es sin embargo una herramienta llamada El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer..
- Examen de seguridad - Examen del grado de seguridad de su aplicación. Esto se puede hacer con herramientas como El Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre hombres y mujeres en materia de empleo, incluida la adopción de medidas para eliminar la discriminación contra la mujer., El Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre hombres y mujeres en materia de empleo, incluida la adopción de medidas legislativas, administrativas, judiciales y de otra índole., El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer..
- Examen del usuario final - Examen de cómo funciona su aplicación para el usuario final. Esto se puede hacer con herramientas como El Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre los hombres y las mujeres en materia de empleo, incluida la eliminación del trabajo forzoso., El Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre los hombres y las mujeres en materia de empleo, incluida la eliminación del trabajo forzoso., El Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre los hombres y las mujeres en materia de empleo, incluida la eliminación del trabajo forzoso..
Se está preparando el proyecto de prueba.
I'm voy a usar xUnit para mis pruebas. Esto es utilizado por defecto en ASPM SK2Projetos de Core NETMSC3 I 'm también voy a utilizar Moq para imitar el Contexto Db junto con
- MoqQueryable - Esto tiene extensiones útiles para mocking IQueryables objects.
- Moq.EntityFrameworkCore M SK1 Esto tiene extensiones útiles para mocking DbContext objects.
Mocking the DbContext
En preparación para esto he añadido una interfaz para mi DbContext. Esto es para que podamos imitar el Db Context en mis pruebasM SK1 Aquí está la interfaz:
namespace Mostlylucid.EntityFramework;
public interface IMostlylucidDBContext
{
public DbSet<CommentEntity> Comments { get; set; }
public DbSet<BlogPostEntity> BlogPosts { get; set; }
public DbSet<CategoryEntity> Categories { get; set; }
public DbSet<LanguageEntity> Languages { get; set; }
public DatabaseFacade Database { get; }
Task<int> SaveChangesAsync(CancellationToken cancellationToken = default);
}
' es bastante simple, simplemente exponiendo nuestros DBSets y el método SaveChangesAsync .
El Presidente (habla en inglés): De conformidad con el entendimiento alcanzado en las consultas previas del Consejo, consideraré que la Asamblea General desea concluir su examen de este tema del programa. El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. use a repository pattern in my code. Esto es porque Entity Framework Core ya es un patrón de repositorio. Uso una capa de servicio para interactuar con el DbContexto
A continuación añademos una nueva clase a nuestra Mostlylucid.Test proyecto con una metodología de extensión para configurar nuestra consulta:
public static class MockDbSetExtensions
{
public static Mock<DbSet<T>> CreateDbSetMock<T>(this IEnumerable<T> sourceList) where T : class
{
// Use the MockQueryable.Moq extension method to create the mock
return sourceList.AsQueryable().BuildMockDbSet();
}
// SetupDbSet remains the same, just uses the updated CreateDbSetMock
public static void SetupDbSet<T>(this Mock<IMostlylucidDBContext> mockContext, IEnumerable<T> entities,
Expression<Func<IMostlylucidDBContext, DbSet<T>>> dbSetProperty) where T : class
{
var dbSetMock = entities.CreateDbSetMock();
mockContext.Setup(dbSetProperty).Returns(dbSetMock.Object);
}
}
En la misma sesión, formularon declaraciones los representantes de Alemania (en nombre del Grupo de Estados de América Latina y el Caribe), Australia, Austria, Bélgica, Bosnia y Herzegovina, Bulgaria, Canadá, Chile, Chipre, Croacia, Dinamarca, Eslovaquia, Eslovenia, España, Estonia, Etiopía, ex República Yugoslava de Macedonia, Finlandia, Francia, Georgia, Grecia, Hungría, Irlanda, Islandia, Italia, Japón, Letonia, Liechtenstein, Lituania, Luxemburgo, Malta, México, Mónaco, Noruega, Nueva Zelandia, Países Bajos, Polonia, Portugal, Reino Unido de Gran Bretaña e Irlanda del Norte, República Checa, Rumania, Suecia, Suiza, Turquía y Ucrania. MockQueryable.Moq método de extensión para crear el mock. que luego configura nuestros objetos IQueryable y IAsyncQueryables.
El Comité recomienda al Estado Parte que incluya en su próximo informe periódico información detallada sobre la situación de los derechos humanos y las libertades fundamentales de todos los niños, incluidos sus derechos económicos, sociales y culturales.
Un principio básico de la prueba de unidad es que cada prueba debe ser una 'unit' de trabajo y no depender del resultado de cualquier otra prueba.
En su novena sesión plenaria, celebrada el 30 de junio de 2008, la Asamblea General decidió incluir en el programa provisional de su sexagésimo segundo período de sesiones el tema titulado “Financiación de la Misión de las Naciones Unidas en Sierra Leona”. BlogServiceFetchTests clase que configuramos nuestro contexto de prueba en el constructor:
public BlogServiceFetchTests()
{
// 1. Setup ServiceCollection for DI
var services = new ServiceCollection();
// 2. Create a mock of IMostlylucidDbContext
_dbContextMock = new Mock<IMostlylucidDBContext>();
// 3. Register the mock of IMostlylucidDbContext into the ServiceCollection
services.AddSingleton(_dbContextMock.Object);
// Optionally register other services
services.AddScoped<IBlogService, EFBlogService>(); // Example service that depends on IMostlylucidDbContext
services.AddLogging(configure => configure.AddConsole());
services.AddScoped<MarkdownRenderingService>();
// 4. Build the service provider
_serviceProvider = services.BuildServiceProvider();
}
I' he comentado esto bastante intensamente para que podamos ver lo que está ocurriendo '. ServiceCollection que es una colección de servicios que podemos utilizar en nuestras pruebas. Luego creamos un modelo de nuestra IMostlylucidDBContext El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. ServiceCollection. Luego registramos cualquier otro servicio que necesitamos para nuestras pruebasM SK1 Finalmente construimos el ServiceProvider que podemos utilizar para obtener nuestros servicios de.
El Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre los hombres y las mujeres en materia de empleo, incluida la eliminación del trabajo forzoso.
He comenzado a añadir una sola clase de prueba, la anteriormente mencionada BlogServiceFetchTests class. Esta es una clase de prueba para el Post obteniendo métodos de mi EFBlogService El Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre los hombres y las mujeres en materia de empleo, incluida la eliminación del trabajo forzoso.
El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. SetupBlogService El Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre los hombres y las mujeres en materia de empleo, incluida la eliminación del trabajo forzoso. EFBlogService Objecto. Esto es para que podamos probar el servicio en isolation.
private IBlogService SetupBlogService(List<BlogPostEntity>? blogPosts = null)
{
blogPosts ??= BlogEntityExtensions.GetBlogPostEntities(5);
// Setup the DbSet for BlogPosts in the mock DbContext
_dbContextMock.SetupDbSet(blogPosts, x => x.BlogPosts);
// Resolve the IBlogService from the service provider
return _serviceProvider.GetRequiredService<IBlogService>();
}
El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer.
Esta es una clase de extensión simple que nos da un número de pupulados BlogPostEntity Objects. Esto es para que podamos probar nuestro servicio con un número de diferentes objetos.
public static List<BlogPostEntity> GetBlogPostEntities(int count, string? langName = "")
{
var langs = LanguageExtensions.GetLanguageEntities();
if (!string.IsNullOrEmpty(langName)) langs = new List<LanguageEntity> { langs.First(x => x.Name == langName) };
var langCount = langs.Count;
var categories = CategoryEntityExtensions.GetCategoryEntities();
var entities = new List<BlogPostEntity>();
var enLang = langs.First();
var cat1 = categories.First();
// Add a root post to the list to test the category filter.
var rootPost = new BlogPostEntity
{
Id = 0,
Title = "Root Post",
Slug = "root-post",
HtmlContent = "<p>Html Content</p>",
PlainTextContent = "PlainTextContent",
Markdown = "# Markdown",
PublishedDate = DateTime.ParseExact("2025-01-01T07:01", "yyyy-MM-ddTHH:mm", CultureInfo.InvariantCulture),
UpdatedDate = DateTime.ParseExact("2025-01-01T07:01", "yyyy-MM-ddTHH:mm", CultureInfo.InvariantCulture),
LanguageEntity = enLang,
Categories = new List<CategoryEntity> { cat1 }
};
entities.Add(rootPost);
for (var i = 1; i < count; i++)
{
var langIndex = (i - 1) % langCount;
var language = langs[langIndex];
var postCategories = categories.Take(i - 1 % categories.Count).ToList();
var dayDate = (i + 1 % 30 + 1).ToString("00");
entities.Add(new BlogPostEntity
{
Id = i,
Title = $"Title {i}",
Slug = $"slug-{i}",
HtmlContent = $"<p>Html Content {i}</p>",
PlainTextContent = $"PlainTextContent {i}",
Markdown = $"# Markdown {i}",
PublishedDate = DateTime.ParseExact($"2025-01-{dayDate}T07:01", "yyyy-MM-ddTHH:mm",
CultureInfo.InvariantCulture),
UpdatedDate = DateTime.ParseExact($"2025-01-{dayDate}T07:01", "yyyy-MM-ddTHH:mm",
CultureInfo.InvariantCulture),
LanguageEntity = new LanguageEntity
{
Id = language.Id,
Name = language.Name
},
Categories = postCategories
});
}
return entities;
}
Usted puede ver que todo esto hace es devolver un número determinado de mensajes de blog con lenguas y categorías. Sin embargo, siempre añademos un M SK1root' objeto que nos permite estar en condiciones de confiar en un objeto conocido en nuestros testsMSC3
El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer.
El Comité recomienda al Estado Parte que incluya en su próximo informe periódico datos estadísticos desglosados por sexo, edad y origen étnico.
Por ejemplo, en los dos siguientes simplemente probamos que podemos obtener todos los puestos y que podemos conseguir puestos por idioma.
[Fact]
public async Task TestBlogService_GetBlogsByLanguage_ReturnsBlogs()
{
var blogService = SetupBlogService();
// Act
var result = await blogService.GetPostsForLanguage(language: "es");
// Assert
Assert.Single(result);
}
[Fact]
public async Task TestBlogService_GetAllBlogs_ReturnsBlogs()
{
var blogs = BlogEntityExtensions.GetBlogPostEntities(2);
var blogService = SetupBlogService(blogs);
// Act
var result = await blogService.GetAllPosts();
// Assert
Assert.Equal(2, result.Count());
}
El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer.
Un concepto importante en la prueba de unidad es 'efecto de prueba ' donde se establece que su código fracasa de la manera que se espera.
En las pruebas de abajo testamos primero que nuestro código de paging funciona como se esperaba. Luego testamos que si pedimos más páginas que tenemos, obtenemos un resultado vacío (y no un errorM SK3
[Fact]
public async Task TestBlogServicePagination_GetBlogsByCategory_ReturnsBlogs()
{
var blogPosts = BlogEntityExtensions.GetBlogPostEntities(10, "en");
var blogService = SetupBlogService(blogPosts);
// Act
var result = await blogService.GetPagedPosts(2, 5);
// Assert
Assert.Equal(5, result.Posts.Count);
}
[Fact]
public async Task TestBlogServicePagination_GetBlogsByCategory_FailsBlogs()
{
var blogPosts = BlogEntityExtensions.GetBlogPostEntities(10, "en");
var blogService = SetupBlogService(blogPosts);
// Act
var result = await blogService.GetPagedPosts(10, 5);
// Assert
Assert.Empty(result.Posts);
}
El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer.
Esto es un simple comienzo para nuestra prueba de unidades. En el siguiente post vamos a añadir pruebas para más servicios y puntos finales. Vamos a ver también cómo podemos probar nuestros puntos finales usando la prueba de integraciónM SK4