Open Source Web Application Framework for ASP.NET Core
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

6.7 KiB

ASP.NET Core MVC / Razor Pages: Testando

Você pode seguir a documentação de Testes de Integração do ASP.NET Core (ASP.NET Core Integration Tests) para aprender detalhes sobre os testes de integração do ASP.NET Core. Este documento explica a infraestrutura de teste adicional fornecida pelo ABP Framework.

O Modelo de Inicialização do Aplicativo

O Modelo de Inicialização do Aplicativo contém o projeto .Web que contém as visualizações/páginas/componentes de interface do usuário do aplicativo e um projeto .Web.Tests para testá-los.

aspnetcore-web-tests-in-solution

Testando as Páginas Razor

Suponha que você tenha criado uma Página Razor chamada Issues.cshtml com o seguinte conteúdo;

Issues.cshtml.cs

using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc.RazorPages;
using MyProject.Issues;

namespace MyProject.Web.Pages
{
    public class IssuesModel : PageModel
    {
        public List<IssueDto> Issues { get; set; }

        private readonly IIssueAppService _issueAppService;

        public IssuesModel(IIssueAppService issueAppService)
        {
            _issueAppService = issueAppService;
        }

        public async Task OnGetAsync()
        {
            Issues = await _issueAppService.GetListAsync();
        }
    }
}

Issues.cshtml

@page
@model MyProject.Web.Pages.IssuesModel
<h2>Lista de Problemas</h2>
<table id="IssueTable" class="table">
    <thead>
        <tr>
            <th>Problema</th>
            <th>Fechado?</th>
        </tr>
    </thead>
    <tbody>
        @foreach (var issue in Model.Issues)
        {
            <tr>
                <td>@issue.Title</td>
                <td>
                    @if (issue.IsClosed)
                    {
                        <span>Fechado</span>
                    }
                    else
                    {
                        <span>Aberto</span>
                    }
                </td>
            </tr>
        }
    </tbody>
</table>

Esta página simplesmente cria uma tabela com os problemas:

issue-list

Você pode escrever uma classe de teste dentro do projeto .Web.Tests da mesma forma que o exemplo abaixo:

using System.Threading.Tasks;
using HtmlAgilityPack;
using Shouldly;
using Xunit;

namespace MyProject.Pages
{
    public class Issues_Tests : MyProjectWebTestBase
    {
        [Fact]
        public async Task Should_Get_Table_Of_Issues()
        {
            // Agir

            var response = await GetResponseAsStringAsync("/Issues");

            // Assert

            var htmlDocument = new HtmlDocument();
            htmlDocument.LoadHtml(response);

            var tableElement = htmlDocument.GetElementbyId("IssueTable");
            tableElement.ShouldNotBeNull();

            var trNodes = tableElement.SelectNodes("//tbody/tr");
            trNodes.Count.ShouldBeGreaterThan(0);
        }
    }
}

GetResponseAsStringAsync é um método de atalho que vem da classe base que realiza uma solicitação HTTP GET, verifica se o status HTTP resultante é 200 e retorna a resposta como uma string.

Você pode usar o objeto base Client (do tipo HttpClient) para realizar qualquer tipo de solicitação ao servidor e ler a resposta você mesmo. GetResponseAsStringAsync é apenas um método de atalho.

Este exemplo usa a biblioteca HtmlAgilityPack para analisar o HTML recebido e testar se ele contém a tabela de problemas.

Este exemplo pressupõe que existam alguns problemas iniciais no banco de dados. Consulte a seção The Data Seed do documento de Testes (Testing document) para aprender como inserir dados de teste, para que seus testes possam assumir que alguns dados iniciais estão disponíveis no banco de dados.

Testando os Controladores

Testar um controlador não é diferente. Basta fazer uma solicitação ao servidor com uma URL adequada, obter a resposta e fazer suas asserções.

Resultado de Visualização

Se o controlador retornar uma visualização, você pode usar um código semelhante para testar o HTML retornado. Veja o exemplo das Páginas Razor acima.

Resultado de Objeto

Se o controlador retornar um resultado de objeto, você pode usar o método base GetResponseAsObjectAsync.

Suponha que você tenha um controlador definido da seguinte forma:

using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using MyProject.Issues;
using Volo.Abp.AspNetCore.Mvc;

namespace MyProject.Web.Controllers
{
    [Route("api/issues")]
    public class IssueController : AbpController
    {
        private readonly IIssueAppService _issueAppService;

        public IssueController(IIssueAppService issueAppService)
        {
            _issueAppService = issueAppService;
        }

        [HttpGet]
        public async Task<List<IssueDto>> GetAsync()
        {
            return await _issueAppService.GetListAsync();
        }
    }
}

Você pode escrever um código de teste para executar a API e obter o resultado:

using System.Collections.Generic;
using System.Threading.Tasks;
using MyProject.Issues;
using Shouldly;
using Xunit;

namespace MyProject.Pages
{
    public class Issues_Tests : MyProjectWebTestBase
    {
        [Fact]
        public async Task Should_Get_Issues_From_Api()
        {
            var issues = await GetResponseAsObjectAsync<List<IssueDto>>("/api/issues");
            
            issues.ShouldNotBeNull();
            issues.Count.ShouldBeGreaterThan(0);
        }
    }
}

Testando o Código JavaScript

O ABP Framework não fornece nenhuma infraestrutura para testar seu código JavaScript. Você pode usar qualquer estrutura de teste e ferramentas para testar seu código JavaScript.

A Infraestrutura de Teste

O pacote Volo.Abp.AspNetCore.TestBase fornece a infraestrutura de teste que está integrada ao ABP Framework e ao ASP.NET Core.

O pacote Volo.Abp.AspNetCore.TestBase já está instalado no projeto .Web.Tests.

Este pacote fornece a classe base AbpWebApplicationFactoryIntegratedTest como a classe base fundamental para derivar as classes de teste. Ela é herdada da classe WebApplicationFactory fornecida pelo ASP.NET Core.

A classe base MyProjectWebTestBase usada acima herda da AbpWebApplicationFactoryIntegratedTest, então herdamos indiretamente a AbpWebApplicationFactoryIntegratedTest.

Veja também