| Path | Audience | Role |
|---|---|---|
tests/ |
Framework maintainers | Unit/integration tests of Elsie itself (CI) |
Elsie.Testing NuGet |
App developers | Helpers to test your Elsie app (ElsieInMemoryHost, loopback ElsieTestHost, asserts) |
Keep Elsie.Testing — it is a product package, not a substitute for our repo’s tests/ folder.
Package Elsie.Testing:
Fast unit tests — no sockets:
await using var host = ElsieInMemoryHost.Create(s =>
{
s.AddElsieModule<TodosModule>();
s.AddSingleton<ITodoStore, FakeStore>();
});
var res = await host.GetAsync("/api/todos");
Assert.Equal(200, res.StatusCode);Creates a DI scope per request (ValidateScopes = true). Entry-assembly scan is off by default.
Exercises the custom server over TCP:
await using var host = ElsieTestHost.Create(s =>
{
s.AddElsieAuth(o =>
{
o.Cookie = new ElsieCookieAuthOptions { CookieName = "t" };
o.Cookie.TicketKeyFromString("test-key");
});
s.AddElsieModule<SecureModule>();
});
var login = await host.PostJsonAsync("/login", new { user = "ada", password = "pass" });
login.EnsureSuccessStatusCode();
var me = await host.GetAsync("/me");HttpClient has cookies enabled for session tests.
await using var server = await ElsieApp.Create()
.QuietConsole(false)
.Listen(IPAddress.Loopback, 0)
.Configure(o => o.ScanEntryAssembly = false)
.Module<PingModule>()
.StartAsync();
using var client = server.CreateClient();
Assert.Equal("pong", await client.GetStringAsync("/ping"));response.AssertStatus(200);
await response.AssertTextAsync("ok");
await response.AssertJsonAsync<Todo>();
response.AssertHeader("X-Test", "yes");var form = new MultipartFormBuilder()
.AddField("title", "hi")
.AddFile("file", "a.txt", Encoding.UTF8.GetBytes("data"))
.Build();
var res = await host.Client.PostAsync("/upload", form);