Skip to content

Latest commit

 

History

History
89 lines (66 loc) · 2.21 KB

File metadata and controls

89 lines (66 loc) · 2.21 KB

Testing

tests/ vs Elsie.Testing

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:

In-memory host (dispatcher only)

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.

Loopback host (real HTTP/1.1)

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.

Fluent ElsieApp in 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"));

Assert helpers

response.AssertStatus(200);
await response.AssertTextAsync("ok");
await response.AssertJsonAsync<Todo>();
response.AssertHeader("X-Test", "yes");

Multipart

var form = new MultipartFormBuilder()
    .AddField("title", "hi")
    .AddFile("file", "a.txt", Encoding.UTF8.GetBytes("data"))
    .Build();
var res = await host.Client.PostAsync("/upload", form);

See also