
AutoFixture em C# (Como funciona para desenvolvedores)
AutoFixture é uma biblioteca de código aberto para .NET que visa minimizar a fase de "preparação" na escrita de testes unitários, melhorando assim o gerenciamento de testes. Seu principal objetivo é permitir que os desenvolvedores se concentrem no que estão testando, em vez do processo de configuração, permitindo a criação de grafos de objetos com dados de teste. Este artigo explora como o AutoFixture pode ser usado para facilitar o desenvolvimento orientado a testes por meio da geração eficiente de dados de teste.
AutoFixture é uma biblioteca poderosa em C# projetada para simplificar o processo de criação de dados de teste para testes unitários. Isso ajuda os desenvolvedores a evitar a escrita de código de configuração repetitivo, gerando automaticamente dados para casos de teste. Em testes unitários, o AutoFixture oferece uma abordagem simplificada para a geração de dados de teste, garantindo que cada teste unitário seja executado com entradas variadas e realistas. O AutoFixture torna os testes em C# mais eficientes, gerando dados de teste automaticamente e reduzindo a necessidade de configuração manual.

Instalação e configuração do AutoFixture
O AutoFixture está disponível como um pacote NuGet e pode ser instalado usando o Console do Gerenciador de Pacotes NuGet ou a opção "Adicionar pacote" do .NET na interface do Gerenciador de Pacotes NuGet do Visual Studio.
O NuGet fará o download e instalará a versão mais recente do AutoFixture e suas dependências em seu projeto.
Exemplo: Criando dados de teste para uma turma
Suponha que temos uma classe simples de funcionário com propriedades como FirstName, LastName e Age. Em vez de criarmos manualmente instâncias dessa classe em nossos testes unitários, podemos usar o AutoFixture para gerar dados aleatórios para nós.
public class Employee
{
public string FirstName { get; set; }
public string LastName { get; set; }
public int Age { get; set; }
public Employee(string firstName, string lastName, int age)
{
FirstName = firstName;
LastName = lastName;
Age = age;
}
public string GetFullName() => $"{FirstName} {LastName}";
}Public Class Employee
Public Property FirstName() As String
Public Property LastName() As String
Public Property Age() As Integer
Public Sub New(ByVal firstName As String, ByVal lastName As String, ByVal age As Integer)
Me.FirstName = firstName
Me.LastName = lastName
Me.Age = age
End Sub
Public Function GetFullName() As String
Return $"{FirstName} {LastName}"
End Function
End ClassDescrição do Código
A classe Employee encapsula detalhes essenciais de um funcionário, incluindo nome, sobrenome e idade, representados por propriedades FirstName, LastName e Age, respectivamente. Seu construtor facilita a instanciação de um objeto funcionário, aceitando esses detalhes como parâmetros e atribuindo-os às propriedades correspondentes. Além disso, o método GetFullName concatena o nome e o sobrenome do funcionário, retornando o nome completo como uma string.
Configurando o código para nosso cenário de teste
Em seguida, iremos criar uma classe de teste para testar a classe Employee:
using AutoFixture;
public class EmployeeTests
{
private readonly IFixture _fixture;
public EmployeeTests()
{
// Using AutoFixture's Fixture to create test data
_fixture = new Fixture();
}
}Imports AutoFixture
Public Class EmployeeTests
Private ReadOnly _fixture As IFixture
Public Sub New()
' Using AutoFixture's Fixture to create test data
_fixture = New Fixture()
End Sub
End ClassDescrição do Código
Este trecho de código incorpora o AutoFixture em testes unitários para a classe Employee. Ao importar o namespace AutoFixture, os desenvolvedores acessam funcionalidades de geração de dados. O campo _fixture, inicializado com uma nova instância de Fixture, simplifica a criação de dados de teste. Esta configuração melhora a eficiência e a confiabilidade dos testes para cobertura abrangente da classe Employee.
Exemplo 1: Validação dos valores do objeto de caso de teste do funcionário
[Fact]
public void Employee_ShouldHaveValidValues()
{
// Arrange
var firstName = _fixture.Create<string>();
var lastName = _fixture.Create<string>();
var age = _fixture.Create<int>();
// Act
var employee = new Employee(firstName, lastName, age);
// Assert
Assert.Equal(firstName, employee.FirstName);
Assert.Equal(lastName, employee.LastName);
Assert.Equal(age, employee.Age);
}<Fact>
Public Sub Employee_ShouldHaveValidValues()
' Arrange
Dim firstName = _fixture.Create(Of String)()
Dim lastName = _fixture.Create(Of String)()
Dim age = _fixture.Create(Of Integer)()
' Act
Dim employee As New Employee(firstName, lastName, age)
' Assert
Assert.Equal(firstName, employee.FirstName)
Assert.Equal(lastName, employee.LastName)
Assert.Equal(age, employee.Age)
End SubDescrição do Código
O método de teste Employee_ShouldHaveValidValues valida que a classe Employee inicializa corretamente suas propriedades com os valores fornecidos. Usando uma fixture de teste para gerar dados aleatórios para FirstName, LastName e Age, o teste cria uma instância de Employee. Em seguida, verifica se as propriedades FirstName, LastName e Age do objeto Employee correspondem aos valores gerados, garantindo que o construtor configure estas propriedades corretamente.
Exemplo 2: Validação do funcionário quando o construtor é invocado
[Fact]
public void CreateEmployee_ValidData_ReturnsEmployeeObject()
{
// Arrange
var employee = _fixture.Create<Employee>();
// Act
// Assert
Assert.NotNull(employee);
Assert.False(string.IsNullOrEmpty(employee.FirstName));
Assert.NotNull(employee.LastName);
Assert.True(employee.Age > 0);
}<Fact>
Public Sub CreateEmployee_ValidData_ReturnsEmployeeObject()
' Arrange
Dim employee = _fixture.Create(Of Employee)()
' Act
' Assert
Assert.NotNull(employee)
Assert.False(String.IsNullOrEmpty(employee.FirstName))
Assert.NotNull(employee.LastName)
Assert.True(employee.Age > 0)
End SubDescrição do Código
Este método de teste inclui asserções de teste que validam se as propriedades de um objeto Employee correspondem a valores gerados aleatoriamente. Ele verifica se as propriedades do tipo string FirstName e LastName, e se int Age estão devidamente configuradas e válidas. Qualquer falha nas asserções indica uma discrepância entre os valores esperados e os valores aleatórios gerados para os dados dos funcionários.

Apresentando o IronPDF
IronPDF C# PDF Library é uma biblioteca robusta em C# desenvolvida pela Iron Software que facilita a leitura de texto em PDF e a criação de documentos PDF usando HTML . Esta ferramenta versátil permite a conversão de documentos fáceis de formatar, incluindo informações de estilo, em PDFs de alta qualidade. Com o IronPDF, gerar PDFs a partir de texto HTML é um processo simples, permitindo que os usuários extraiam conteúdo HTML de URLs e o transformem em arquivos PDF bem estruturados. Essa funcionalidade torna o IronPDF uma ferramenta essencial para desenvolvedores que buscam automatizar e agilizar a criação de documentos PDF profissionais diretamente a partir de conteúdo da web.

Instalando o IronPDF
Abra o console do Gerenciador de Pacotes NuGet e execute o seguinte comando:
Exemplo de código usando os recursos do AutoFixture com o IronPDF
Abaixo, segue um exemplo que demonstra o uso do AutoFixture em conjunto com o IronPDF para gerar um PDF com dados de funcionários:
using DemoAutofixture;
using IronPdf;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
public class EmployeePdfGenerator
{
private readonly Fixture _fixture;
public EmployeePdfGenerator()
{
_fixture = new Fixture();
}
public List<Employee> GenerateEmployees(int count)
{
return _fixture.CreateMany<Employee>(count).ToList();
}
public void GeneratePdf(List<Employee> employees, string filePath)
{
IronPdf.License.LicenseKey = "Your-License-Key-Here";
var renderer = new ChromePdfRenderer();
string htmlContent = GenerateHtml(employees);
try
{
renderer.RenderHtmlAsPdf(htmlContent).SaveAs(filePath);
Console.WriteLine("PDF Created Successfully!");
}
catch (Exception ex)
{
Console.WriteLine($"Error generating PDF: {ex.Message}");
}
}
private string GenerateHtml(List<Employee> employees)
{
StringBuilder htmlBuilder = new StringBuilder();
htmlBuilder.Append("<!DOCTYPE html><html><head><title>Employee List</title></head><body><h1>Employee List</h1><ul>");
foreach (var employee in employees)
{
htmlBuilder.Append($"<li>{employee.GetFullName()} - Age: {employee.Age}</li>");
}
htmlBuilder.Append("</ul></body></html>");
return htmlBuilder.ToString();
}
}Imports DemoAutofixture
Imports IronPdf
Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Text
Public Class EmployeePdfGenerator
Private ReadOnly _fixture As Fixture
Public Sub New()
_fixture = New Fixture()
End Sub
Public Function GenerateEmployees(ByVal count As Integer) As List(Of Employee)
Return _fixture.CreateMany(Of Employee)(count).ToList()
End Function
Public Sub GeneratePdf(ByVal employees As List(Of Employee), ByVal filePath As String)
IronPdf.License.LicenseKey = "Your-License-Key-Here"
Dim renderer = New ChromePdfRenderer()
Dim htmlContent As String = GenerateHtml(employees)
Try
renderer.RenderHtmlAsPdf(htmlContent).SaveAs(filePath)
Console.WriteLine("PDF Created Successfully!")
Catch ex As Exception
Console.WriteLine($"Error generating PDF: {ex.Message}")
End Try
End Sub
Private Function GenerateHtml(ByVal employees As List(Of Employee)) As String
Dim htmlBuilder As New StringBuilder()
htmlBuilder.Append("<!DOCTYPE html><html><head><title>Employee List</title></head><body><h1>Employee List</h1><ul>")
For Each employee In employees
htmlBuilder.Append($"<li>{employee.GetFullName()} - Age: {employee.Age}</li>")
Next employee
htmlBuilder.Append("</ul></body></html>")
Return htmlBuilder.ToString()
End Function
End ClassPara usar esta classe, você instanciaria EmployeePdfGenerator, geraria uma lista de funcionários e então chamaria GeneratePdf:
List<Employee> employees = new()
{
new Employee("John", "Smith", 32),
new Employee("Emily", "Davis", 18),
new Employee("David", "Brown", 24),
new Employee("Jane", "Doe", 16),
new Employee("Michael", "Johnson", 49),
};
EmployeePdfGenerator pdfGenerator = new();
pdfGenerator.GeneratePdf(employees, "EmployeeList.pdf");Dim employees As New List(Of Employee)() From {
New Employee("John", "Smith", 32),
New Employee("Emily", "Davis", 18),
New Employee("David", "Brown", 24),
New Employee("Jane", "Doe", 16),
New Employee("Michael", "Johnson", 49)
}
Dim pdfGenerator As New EmployeePdfGenerator()
pdfGenerator.GeneratePdf(employees, "EmployeeList.pdf")
Descrição do Código
O código C# fornecido utiliza a biblioteca IronPDF para gerar um documento PDF listando os funcionários e suas idades. Define uma classe EmployeePdfGenerator que inclui o método GeneratePdf, que recebe uma lista de objetos Employee e um caminho de arquivo. Internamente, ele constrói o conteúdo HTML através do método GenerateHtml, então utiliza a classe HtmlToPdf do IronPDF para renderizar este HTML como um PDF, salvo no caminho de arquivo especificado. As melhorias incluem o uso de StringBuilder para geração de HTML e adição de tratamento básico de erros para geração de PDF e salvamento de arquivo.
Como escrever um método de teste
Na configuração abaixo, o AutoFixture é utilizado para criar instâncias da classe Employee, permitindo a geração de dados aleatórios para testes. O IronPDF é utilizado para converter, de forma integrada, conteúdo HTML, incluindo informações de funcionários, em formato PDF. A classe EmployeePdfGenerator orquestra esses processos, gerenciando eficientemente tanto a geração de dados quanto a conversão para PDF. Enquanto isso, a classe de teste XUnit EmployeePdfGeneratorTests garante a funcionalidade adequada da geração de PDF por meio de testes rigorosos. Essa abordagem integrada simplifica a geração e a documentação de dados de funcionários, garantindo robustez e confiabilidade no processo de geração de PDFs.
using System.IO;
using Xunit;
public class EmployeePdfGeneratorTests
{
[Fact]
public void GeneratePdf_GeneratesPdfFile()
{
// Arrange
var generator = new EmployeePdfGenerator();
var employees = generator.GenerateEmployees(5);
string filePath = "EmployeeList.pdf";
// Act
generator.GeneratePdf(employees, filePath);
// Assert
Assert.True(File.Exists(filePath));
}
}Imports System.IO
Imports Xunit
Public Class EmployeePdfGeneratorTests
<Fact>
Public Sub GeneratePdf_GeneratesPdfFile()
' Arrange
Dim generator = New EmployeePdfGenerator()
Dim employees = generator.GenerateEmployees(5)
Dim filePath As String = "EmployeeList.pdf"
' Act
generator.GeneratePdf(employees, filePath)
' Assert
Assert.True(File.Exists(filePath))
End Sub
End ClassAqui a classe EmployeePdfGeneratorTests contém um caso de teste que valida a criação de um arquivo PDF no caminho de arquivo especificado, garantindo que o método GeneratePdf funcione corretamente.

Conclusão
O AutoFixture simplifica a fase de "Organização" da escrita de testes unitários em .NET, oferecendo aos desenvolvedores uma maneira de se concentrarem nos casos de teste em vez das complexidades da configuração. Simplifica o processo de teste de unidade, garantindo entradas variadas e realistas através da geração automática de dados de teste. Em conjunto com as informações de licenciamento do IronPDF , oferece uma combinação poderosa para uso contínuo e suporte.

Curtis Chau é bacharel em Ciência da Computação (Universidade Carleton) e se especializa em desenvolvimento front-end, com experiência em Node.js, TypeScript, JavaScript e React. Apaixonado por criar interfaces de usuário intuitivas e esteticamente agradáveis, Curtis gosta de trabalhar com frameworks modernos e criar manuais bem estruturados e visualmente atraentes.
Artigos relacionados


