AutoFixture, if you’ve not heard of it, allows for generation of anonymous data in unit tests. This allows for generating random numbers, strings etc. as well as more complex object graphs to allow you, the developer, to concentrate on the testing and not the creation of the test data.

With the release of C# 9 recently and the new record types I was curious to see if AutoFixture could handle them.

Let’s see!


Let’s start off with the definition of the record type we are going to be using in these examples.

public record ProductId(int Value);

It’s relatively straight forward to test the basic setup.

Setting up usage of a record type is really straight forward and on first viewing you might be mistaken it’s a class from it’s construction.

public void ByItSelf()
    var product = new ProductId(11);

This will create a new ProductId record with the value of 11. Pretty straight forward.

When you generate data using AutoFixture the starting point is always the Fixture class.

public void With_Fixture()
    var fixture = new Fixture();

    var product = fixture.Create<ProductId>();

Like creating an instance of a POCO class requesting a new ProductId to be created is exactly the same. Debugging through this test you will be able to see that the int value provided to the constructor is randomly seeded as you’d expect.

But can it work with the xUnit data attributes?

Of course it can!

You can decorate any test which is marked with the [Theory] attribute with the [AutoData] extension attribute and specify the parameter being passed into the test method is of our record type. Under the hood this will do exactly what we did in the previous example but the Fixture instance is managed by the extension library.

public void With_Attribute(ProductId productId)


The above will inject an instance of ProductId with a randomly seeded int as before but without you having to write the Fixture code.

If you’ve not seen it before AutoDataAttribute is part of the AutoFixture.Xunit2 nuget package which I highly recommand you check out.


In short Autofixture can handle the new record type no problem. I’ve only tried it on simple samples but it appears to be able to handle it like other types and generates the required anonymous values as expected.

Done some crazy stuff with record types and AutoFixture? Managed to break it? Please let me know on Twitter @WestDiscGolf.