Verify.AspNetCore
April 9, 2026 ยท View on GitHub
Extends Verify to allow verification of AspNetCore bits.
See Milestones for release notes.
Sponsors
Entity Framework Extensions
Entity Framework Extensions is a major sponsor and is proud to contribute to the development this project.
Developed using JetBrains IDEs
NuGet
Usage
Enable VerifyAspNetCore once at assembly load time:
[ModuleInitializer]
public static void Initialize() =>
VerifyAspNetCore.Initialize();
Controller
Given the following controller:
public class MyController :
Controller
{
public ActionResult<List<DataItem>> Method(string input)
{
var headers = HttpContext.Response.Headers;
headers["headerKey"] = "headerValue";
headers["receivedInput"] = input;
var cookies = HttpContext.Response.Cookies;
cookies.Append("cookieKey", "cookieValue");
var items = new List<DataItem>
{
new("Value1"),
new("Value2")
};
return new(items);
}
public class DataItem(string value)
{
public string Value { get; } = value;
}
}
This test:
[Test]
public Task Test()
{
var context = new ControllerContext
{
HttpContext = new DefaultHttpContext()
};
var controller = new MyController
{
ControllerContext = context
};
var result = controller.Method("inputValue");
return Verify(
new
{
result,
context
});
}
Will result in the following verified file:
{
result: [
{
Value: Value1
},
{
Value: Value2
}
],
context: {
HttpContext: {
Request: {},
Response: {
StatusCode: OK,
Headers: {
headerKey: headerValue,
receivedInput: inputValue
},
Cookies: {
cookieKey: cookieValue
}
}
}
}
}
Middleware
Given the following middleware:
public class MyMiddleware(RequestDelegate next)
{
public Task Invoke(HttpContext context)
{
context.Response.Headers["headerKey"] = "headerValue";
return next(context);
}
}
This test:
[Test]
public async Task Test()
{
var nextCalled = false;
var middleware = new MyMiddleware(
_ =>
{
nextCalled = true;
return Task.CompletedTask;
});
var context = new DefaultHttpContext();
await middleware.Invoke(context);
await Verify(
new
{
context.Response,
nextCalled
});
}
Will result in the following verified file:
{
Response: {
StatusCode: OK,
Headers: {
headerKey: headerValue
}
},
nextCalled: true
}
Testing a web app with specific controller scenarios
UseSpecificControllers extends IMvcBuilder to allow integration testing of a web app using a specific controller scenario.
[Test]
public async Task ControllerIntegrationTest()
{
var builder = WebApplication.CreateBuilder();
var controllers = builder.Services.AddControllers();
// custom extension
controllers.UseSpecificControllers(typeof(FooController));
await using var app = builder.Build();
app.MapControllers();
await app.StartAsync();
using var client = new HttpClient();
var result = client.GetStringAsync($"{app.Urls.First()}/Foo");
await Verify(result);
}
[ApiController]
[Route("[controller]")]
public class FooController :
ControllerBase
{
[HttpGet]
public string Get() =>
"Foo";
}
ScrubAspTextResponse
The ScrubAspTextResponse feature allows modification or scrubbing of the content of an HTTP response before verification. This is useful for scenarios where the response contains dynamic or sensitive data that needs to be replaced or removed.
[Test]
public Task ScrubAspTextResponse()
{
var context = new DefaultHttpContext();
var buffer = "{\"key\":\"value\"}"u8;
var response = context.Response;
response.Body = new MemoryStream(buffer.ToArray());
response.ContentType = "application/json";
return Verify(response)
.ScrubAspTextResponse(_ => _.Replace("value", "replace"));
}
Results in:
{
StatusCode: OK,
Headers: {
Content-Type: application/json
},
Value: {
key: replace
}
}
Icon
Spider designed by marialuisa iborra from The Noun Project.

