> For the complete documentation index, see [llms.txt](https://docs.educationsmediagroup.com/unit-testing-csharp/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.educationsmediagroup.com/unit-testing-csharp/autofixture/relays.md).

# Relays

AutoFixture is focused on creating instances of concrete types. For this reason it doesn't have any support for non-concrete types like interfaces and abstract classes.

By default, AutoFixture is only able to work with concrete types. In some cases, interfaces and abstract classes have an implementation or a subtype that can be used as default. To handle cases like this, AutoFixture offers the class `TypeRelay`.

A `TypeRelay` is a customization that can be used to instruct the Fixture to relay requests of a certain type to another one.

```csharp
public abstract class Animal { }

public class Dog : Animal { }

[Test]
public void Fixture_should_return_relayed_type()
{
    // ARRANGE
    var fixture = new Fixture();
    fixture.Customizations.Add(new TypeRelay(typeof(Animal), typeof(Dog)));

    // ACT
    var animal = fixture.Create<Animal>();

    // ASSERT
    Assert.That(animal, Is.InstanceOf<Dog>());
}
```

AutoFixture uses relays to support well-known interfaces like `IList<T>`. The [collection interfaces](/unit-testing-csharp/autofixture/default-configurations.md#collections) are forwarded to their most common implementation.
