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));