RSCG – Ridge
| name | Ridge |
| nuget | https://www.nuget.org/packages/Ridge/ |
| link | https://github.com/Melchy/Ridge |
| author | Michal Motyčka |
Generating test classes for controllers
This is how you can use Ridge .
The code that you start with is
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="7.0.9" />
<PackageReference Include="RidgeDotNet.AspNetCore" Version="2.0.1" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" />
</ItemGroup>
<PropertyGroup>
<EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
<CompilerGeneratedFilesOutputPath>$(BaseIntermediateOutputPath)\GX</CompilerGeneratedFilesOutputPath>
</PropertyGroup>
</Project>
The code that you will use is
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseAuthorization();
app.MapControllers();
app.Run();
public partial class Program { }
using Microsoft.AspNetCore.Mvc;
using Ridge.AspNetCore.GeneratorAttributes;
namespace RidgeDemoWebApp.Controllers
{
[GenerateClient]
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
private static readonly string[] Summaries = new[]
{
"Freezing","Bracing","Chilly","Cool","Mild","Warm","Balmy","Hot","Sweltering","Scorching"
};
private readonly ILogger<WeatherForecastController> _logger;
public WeatherForecastController(ILogger<WeatherForecastController> logger)
{
_logger = logger;
}
[HttpGet(Name = "GetWeatherForecast")]
public IEnumerable<WeatherForecast> Get()
{
return Enumerable.Range(1,5).Select(index => new WeatherForecast
{
Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
TemperatureC = Random.Shared.Next(-20,55),
Summary = Summaries[Random.Shared.Next(Summaries.Length)]
})
.ToArray();
}
}
}
using Microsoft.AspNetCore.Mvc.Testing;
using RidgeDemoWebApp.Controllers;
using Xunit;
namespace TestRidgeApp;
[TestClass]
public class BasicTests
{
[TestMethod]
public async Task CallControllerUsingRidge()
{
using var webApplicationFactory =
new WebApplicationFactory<Program>()
.WithRidge(); // add ridge dependencies to WebApplicationFactory
var client = webApplicationFactory.CreateClient();
// create instance of client generated by source generator
var examplesControllerClient = new WeatherForecastControllerClient(client,webApplicationFactory.Services);
var response = await examplesControllerClient.Get();
Assert.IsTrue(response.IsSuccessStatusCode);
Assert.AreEqual(5,response.Result.Count());
}
}
The code that is generated is
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by the Ridge source generator
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
#nullable enable
#pragma warning disable CS0419
using Ridge.AspNetCore;
using Ridge.AspNetCore.Serialization;
using Ridge.AspNetCore.Response;
using Ridge.AspNetCore.Parameters;
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
namespace RidgeDemoWebApp.Controllers
{
/// <summary>
/// Generated Api client. Calls <see cref="RidgeDemoWebApp.Controllers.WeatherForecastController" />
/// </summary>
public class WeatherForecastControllerClient
{
private readonly IApplicationClient _applicationClient;
/// <summary>
/// Creates client for controller.
/// </summary>
/// <param name="httpClient">
/// HttpClient which will be used to call application.
/// </param>
/// <param name="serviceProvider">
/// Application serviceProvider.
/// </param>
public WeatherForecastControllerClient(HttpClient httpClient,IServiceProvider serviceProvider)
{
var applicationClientFactory = serviceProvider.GetService<IApplicationClientFactory>();
if(applicationClientFactory == null)
{
throw new InvalidOperationException("'IApplicationClientFactory' could not be resolved. Did you forget to call WithRidge()?.");
}
else
{
_applicationClient = applicationClientFactory.CreateClient(serviceProvider,httpClient);
}
}
/// <summary>
/// Calls <see cref="RidgeDemoWebApp.Controllers.WeatherForecastController.Get" />.
/// </summary>
public async Task<HttpCallResponse<System.Collections.Generic.IEnumerable<RidgeDemoWebApp.WeatherForecast>>> Get(params AdditionalParameter[] additionalParameters)
{
var methodName = nameof(RidgeDemoWebApp.Controllers.WeatherForecastController.Get);
var actionParameters = new Type[] {
};
var parametersAndTransformations = new List<RawParameterAndTransformationInfo>()
{
};
return await _applicationClient.CallAction<System.Collections.Generic.IEnumerable<RidgeDemoWebApp.WeatherForecast>,RidgeDemoWebApp.Controllers.WeatherForecastController>(methodName,actionParameters,additionalParameters,parametersAndTransformations);
}
}
}
#pragma warning restore CS0419
#nullable restore
Code and pdf at
https://ignatandrei.github.io/RSCG_Examples/v2/docs/Ridge
Leave a Reply