Testavior es una solución ligera para ayudarlo a desarrollar pruebas de comportamiento para ASP.NET Core .
Las pruebas de comportamiento son una forma de probar las características de su aplicación que aplican diferentes tipos de comportamientos para cubrir un escenario funcional .
Proporciona un enfoque simple y eficiente para escribir pruebas automatizadas para su aplicación ASP.NET Core.
Para obtener más información sobre las pruebas de comportamiento con ASP.NET Core, eche un vistazo aquí http://geeklearning.io/a-diFferent-Procoach-to-test-your-asp-net-core-plication
Testavior proporciona 2 bibliotecas:
En su proyecto ASP.NET Core
> dotnet add package GeekLearning.Testavior.Configuration
En su proyecto de prueba unitaria de .NET Core
> dotnet add package GeekLearning.Testavior
El entorno de prueba proporcionado por Testavior se basa en un servicio de configuración de inicio que le permite separar la configuración del entorno de producción de la configuración del entorno de prueba . Este servicio de configuración está representado por un contrato IStartupConfigurationService que defina 3 métodos: Configure - ConfigureEnvironment - ConfigureService que debe llamarse dentro de la rutina de inicio para inyectar una configuración dependiente del entorno.
1 - En su proyecto ASP.NET Core :
StartupConfigurationService (cambie el nombre si lo desea) a su proyecto web.IStartupConfigurationService (opcionalmente, herede de DefaultStartupConfigurationService para usar la implementación vacía predeterminada)ConfigureServices : implementa las opciones de configuración que son específicas del entorno de producciónConfigure : implementa la configuración de middleware específica para el entorno de producciónConfigureEnvironment : Implemente lo que debe ejecutarse antes de cualquier cosaMuestra:
public class StartupConfigurationService : DefaultStartupConfigurationService
{
public override void ConfigureServices ( IServiceCollection services , IConfigurationRoot configuration )
{
base . ConfigureServices ( services , configuration ) ;
var connection = "CONNECTION_STRING" ;
services . AddDbContext < [ EF_DB_CONTEXT ] > ( options =>
options . UseSqlServer ( connection ) ) ;
}
} 2 - En su clase de programa :
Inyecte su StartupConfigurationService llamando al método ConfigureStartup en su WebHostBuilder :
new WebHostBuilder ( )
.. .
. UseStartup < Startup > ( )
. ConfigureStartup < StartupConfigurationService > ( ) 3 - En tu clase Startup :
IStartupConfigurationService en la clase StartupConfigureEnvironment al final del constructor StartupConfigureServices al final del método original Startup.ConfigureServicesConfigure al comienzo del método original Startup.ConfigureMuestra:
public class Startup
{
private IStartupConfigurationService externalStartupConfiguration ;
public Startup ( IHostingEnvironment env , IStartupConfigurationService externalStartupConfiguration = null )
{
this . externalStartupConfiguration = externalStartupConfiguration ;
this . externalStartupConfiguration . ConfigureEnvironment ( env ) ;
}
public void ConfigureServices ( IServiceCollection services )
{
services . AddMvc ( )
// Pass configuration (IConfigurationRoot) to the configuration service if needed
this . externalStartupConfiguration . ConfigureServices ( services , null ) ;
}
public void Configure ( IApplicationBuilder app , IHostingEnvironment env , ILoggerFactory loggerFactory )
{
this . externalStartupConfiguration . Configure ( app , env , loggerFactory ) ;
app . UseMvc ( ) ;
}
} 4 - En su archivo de proyecto de prueba:
El motor Razor usa archivos de dependencia (.deps.json) para resolver algunas referencias en tiempo de ejecución. Entonces, para probar la parte MVC de una aplicación, es necesario importar estos archivos. Para hacerlo, agregue la siguiente sección a su .csproj :
< Target Name = " CopyDepsFiles " AfterTargets = " Build " Condition = " '$(TargetFramework)'!='' " >
< ItemGroup >
< DepsFilePaths Include = " $([System.IO.Path]::ChangeExtension('%(_ResolvedProjectReferencePaths.FullPath)', '.deps.json')) " />
</ ItemGroup >
< Copy SourceFiles = " %(DepsFilePaths.FullPath) " DestinationFolder = " $(OutputPath) " Condition = " Exists('%(DepsFilePaths.FullPath)') " />
</ Target > 5 - Para usuarios de XUnit
Si tiene la intención de usar XUnit, primero siga la documentación oficial, luego agregue un archivo xunit.runner.json a su proyecto de prueba:
{
"shadowCopy" : false
} y agregue la siguiente sección a su .csproj :
< ItemGroup >
< None Include = " xunit.runner.json " CopyToOutputDirectory = " PreserveNewest " />
</ ItemGroup > Se requiere un IStartupConfigurationService específico para el entorno de prueba si desea implementar una configuración específica de prueba .
Testavior viene con una prueba de implementación específica IStartupConfigurationService : TestStartupConfigurationService que proporciona un entorno de prueba lleno de características útiles (ver sección de características ).
Por supuesto, puede implementar su propio servicio de configuración de inicio (mediante el uso de TestStartupConfigurationService o no).
Para crear un entorno de prueba , simplemente instancie la clase TestEnvironment al pasarlo su Startup de la aplicación ASP.NET Core, su implementación de IStartupConfigurationService , el tipo de su Core ObjectContext y la ruta relativa a su proyecto ASP.NET Core (requerido para resolver las vistas MVC).
var testEnvironment = new TestEnvironment < Startup , TestStartupConfigurationService < [ EF_DB_CONTEXT ] > > (
Path . Combine ( System . AppContext . BaseDirectory , @"[PATH_TO_WEB_APP]" ) ) ; Escriba su prueba API simplemente enviando solicitudes web utilizando el entorno de prueba :
[ TestMethod ]
public void ScenarioShouldBeOk ( )
{
var testEnvironment = new TestEnvironment < Startup , TestStartupConfigurationService < [ EF_DB_CONTEXT ] > > (
Path . Combine ( System . AppContext . BaseDirectory , @"[PATH_TO_WEB_APP]" ) ) ;
var response = testEnvironment . Client . GetAsync ( "/api/data" ) . Result ;
response . EnsureSuccessStatusCode ( ) ;
// Test result content
var result = JsonConvert . DeserializeObject < Data [ ] > ( response . Content . ReadAsStringAsync ( ) . Result ) ;
Assert . AreEqual ( "data" , result . Data ) ;
} Escribir una prueba MVC es casi tan fácil como probar una API, excepto que es posible que desee probar el modelo devuelto por el servidor y no la vista .
Para hacer eso, Testavior proporciona un repositorio de ViewModel que interceptará y almacenará los modelos de la vista devueltos por el servidor.
Puede acceder a este repositorio utilizando el mecanismo de inyección de dependencia del núcleo ASP.NET:
[ TestMethod ]
public void ScenarioShouldBeOk ( )
{
var testEnvironment = new TestEnvironment < Startup , TestStartupConfigurationService < [ EF_DB_CONTEXT ] > > (
Path . Combine ( System . AppContext . BaseDirectory , @"[PATH_TO_WEB_APP]" ) ) ;
testEnvironment . Client . GetAsync ( "/" ) . Result . EnsureSuccessStatusCode ( ) ;
var viewModel = testEnvironment
. ServiceProvider
. GetRequiredService < ViewModelRepository > ( )
. Get < [ VIEWMODEL_TYPE ] > ( ) ;
Assert . AreEqual ( "data" , viewModel . Data ) ;
}Y no dude en echar un vistazo a la sección de muestras;)
¡Felices pruebas! :)