Choose built-in snapshots or Verify.Xunit
Both integrations can capture normalized controller responses and complete TestServer exchanges. Choose based on the approval workflow already used by the test suite.
| Consideration | Built-in engine | Verify.Xunit adapter |
|---|---|---|
| Package | XBullet.EasyTesting.Snapshots.Core |
XBullet.EasyTesting.Verify.Xunit |
| Test framework dependency | None | xUnit v3 and Verify.Xunit |
| Arbitrary values, raw JSON, and plain text | Built in | Use Verify directly for additional shapes |
| Controller and complete exchange model | Supported | Same normalized XBullet capture model converted for Verify |
| File/update workflow | XBullet received, verified, maintenance, and CI guards | Verify's naming, diffing, scrubbers, and acceptance workflow |
Outbound StubHttpMessageHandler snapshots |
XBullet.EasyTesting.Snapshots.Http |
Not provided by this adapter |
| Project defaults | XBullet global and fixture-local templates | Verify settings and Verify project configuration |
Prefer the built-in engine when
- The project should not depend on a test framework or Verify.
- One workflow should cover JSON, text, controller responses, real exchanges, and outbound stubs.
- Runtime-qualified received files and guarded bulk maintenance match the team's CI model.
- XBullet's structural path transformations and defaults are sufficient.
Prefer Verify.Xunit when
- The xUnit v3 suite already uses Verify and contributors know its approval workflow.
- Existing Verify scrubbers, converters, extensions, or tooling should own snapshot review.
- The required XBullet surface is controller responses or complete TestServer exchanges.
The adapter is invoked directly on the real controller response:
[Fact]
public Task Authenticated_controller_matches_snapshot() =>
Run(async (scope, cancellationToken) =>
{
using var client = scope.CreateAuthenticatedClient(
TestUser.Create(name: "Ada", nameIdentifier: "user-42"));
using var response = await client.GetAsync("/api/secure/me", cancellationToken);
await response.VerifyControllerSnapshot(cancellationToken: cancellationToken);
});
Coexistence
Both engines can coexist in one test project. Assign one owner per snapshot type and document the choice so contributors know which received files, acceptance commands, and configuration apply. Do not run the same contract through both engines unless comparing adapters is itself the test.
For Verify-specific controller and exchange configuration, continue with the Verify.Xunit guide. For the built-in approval workflow, see getting started and maintenance.
API references: built-in engine and Verify.Xunit adapter.