Arrange

Both sync and async is supported in the arrange step, as well as additional And steps.


private static Task<string> LoadWidgetNameFromDatabase()
{
    return Task.FromResult("Widget1");
}

[Fact(DisplayName = "SerializeAsync can work with anonymous objects")]
public Task ExampleTest2() =>
    Arrange(async () =>
        {
            // async is supported
            var widgetNameFromDatabase = await LoadWidgetNameFromDatabase();
            return new { Name = widgetNameFromDatabase, Cost = 12.50 };
        })
        // additional And stages are also supported after at least one Arrange call
        .And(widget =>
        {
            var ms = new MemoryStream();
            return (widget, ms);
        })
        .Act(async data =>
        {
            await JsonSerializer.SerializeAsync(
                data.ms,
                data.widget,
                cancellationToken: TestContext.Current.CancellationToken
            );
            return Encoding.UTF8.GetString(data.ms.ToArray());
        })
        .Assert(result => !string.IsNullOrWhiteSpace(result));

And Type directed development is supported as well.


[Fact(DisplayName = "SerializeAsync can work with anonymous objects")]
public Task ExampleTest3() =>
    // existing objects can also be lifted into the DSL
    new { Name = "Widget1", Cost = 12.50 }
        // using the extension method
        .Arrange()
        .And(widget =>
        {
            var ms = new MemoryStream();
            return (widget, ms);
        })
        .Act(async data =>
        {
            await JsonSerializer.SerializeAsync(
                data.ms,
                data.widget,
                cancellationToken: TestContext.Current.CancellationToken
            );
            return Encoding.UTF8.GetString(data.ms.ToArray());
        })
        .Assert(result => !string.IsNullOrWhiteSpace(result));