Auto Disposal
Any type that implements IDisposable or IAsyncDisposable are auto disposed by the DSL.
This means that you can just return whatever type without needing to worry about
wrapping the DSL in using
blocks.
private sealed class SomeDisposableType : IDisposable
{
public bool IsDisposed { get; private set; }
public void Dispose()
{
IsDisposed = true;
}
}
[Fact(DisplayName = "Auto disposal is still standard")]
public async Task ExampleTest1()
{
// disposable type without a using
var disposableType = new SomeDisposableType();
// won't be disposed within the DSL
await disposableType.Arrange().Act(data => data.IsDisposed).Assert(Assert.False);
// it will be disposed after
Assert.True(disposableType.IsDisposed);
}
If you want to opt out of this behaviour call NoDisposal which will stop disposal.
[Fact(DisplayName = "Manual disposal is still possible")]
public async Task ExampleTest2()
{
// disposable type
var disposableType = new SomeDisposableType();
await disposableType
.Arrange()
.Act(data => data.IsDisposed)
.Assert(Assert.False)
// disable auto-disposal
.NoDisposal();
// it will not be disposed
Assert.False(disposableType.IsDisposed);
}