Skip to content
Fill random/edge-case value to target type for unit testing, supports both .NET Standard and Unity.
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.
.circleci for Unity May 6, 2019
sandbox/ConsoleApp small changes Apr 28, 2019
.gitignore adds the missing meta Apr 29, 2019
LICENSE for Unity May 6, 2019
RandomFixtureKit.sln small changes Apr 28, 2019



Fill random/edge-case value to target type for unit testing, supports both .NET Standard and Unity. This lib is similar as AutoFixture but has some different things.


NuGet: RandomFixtureKit

Install-Package RandomFixturekit

Unity: releases/RandomFixtureKit.unitypackage

or package.json exists on src/RandomFixtureKit.Unity/Assets/Scripts/RandomFixtureKit for unity package manager.

How to use

// get single value
var value = FixtureFactory.Create<Foo>();

// get array
var values = FixtureFactory.CreateMany<Bar>();

// get temporal value(you can use this values to use invoke target method)
var (x, y, z) = FixtureFactory.Create<(int, string, short)>();

In the default, all fill values are random(and not includes null). This behaviour is configure by IGeneratorResolver resolver overload.

// default is NotNull resolver, the value is completely random
var value1 = FixtureFactory.Create<int>(resolver: StandardResolver.NotNull);

// you can change the EdgeCaseResolver, 
var value2 = FixtureFactory.Create<int>(resolver: StandardResolver.EdgeCase);

// you can change the default resolver.
FixtureFactory.Default = StandardResolver.EdgeCase;

// or make the new you combine resolver.
// this configuration uses string => fill Japanese Hiragana and others as NonNullResolver
var resolver = new CompositeResolver(new[] {
        new JapaneseHiraganaGenerator(stringLength:9),
    }, new[] {

// for fill interface type, need to map before call create
FixtureFactory.RegisterMap<IFoo, Foo>();
var v = FixtureFactory.Create<IFoo>(); // return Foo object


edge-case, for example int is filled int.MinValue, int.MaxValue, 0, -1 or 1. collection(array, list, etc...) is filled null, zero-elements, one-elements, nine-elements.

Custom Generator

Implement IGenerator and setup composite-resolver, you can control how generate values.

// for example, increment Id on create MyClass value.
public class MyClass
    public int Id { get; set; }
    public int Age { get; set; }
    public string Name { get; set; }

    public override string ToString()
        return (Id, Age, Name).ToString();

// Create IGenerator.
public class MyClassSequentialIdGenerator : IGenerator
    int sequence = 0;
    IGenerator fallbackGenerator = new Int32Generator();

    // this generator called if requires int value.
    public Type Type => typeof(int);

    public object Generate(in GenerationContext context)
        // check target int field belongs MyClass.
        if (context.FieldInfo != null)
            // auto-implemented property's field: <Id>k__BackingField
            if (context.FieldInfo.DeclaringType == typeof(MyClass) && context.FieldInfo.Name.StartsWith("<Id>"))
                return (sequence++);

        return fallbackGenerator.Generate(context);

// setup generator to use
var resolver = new CompositeResolver(new[] { new MyClassSequentialIdGenerator() }, new[] { StandardResolver.NonNull });
var fixture = new Fixture(resolver); // fixture is instance version of FixtureFactory

var foo = fixture.CreateMany<MyClass>(100);
foreach (var item in foo)

Author Info

This library is mainly developed by Yoshifumi Kawai(a.k.a. neuecc).
He is the CEO/CTO of Cysharp which is a subsidiary of Cygames.
He is awarding Microsoft MVP for Developer Technologies(C#) since 2011.
He is known as the creator of UniRx and MessagePack for C#.


This library is under the MIT License.

You can’t perform that action at this time.