Как заставить AutoFixture работать для неизменяемых классов с древовидной структурой? - PullRequest
1 голос
/ 04 октября 2019

Этот небольшой тест здесь:

[TestClass]
public class TreeXTests
{
    [TestMethod]
    public void ShouldCreateSmallTree()
    {
        // Arrange
        var fixture = new Fixture();
        fixture.Behaviors.Add(new OmitOnRecursionBehavior(3));
        fixture.Behaviors.OfType<ThrowingRecursionBehavior>().ToList()
            .ForEach(b => fixture.Behaviors.Remove(b));

        // Act
        var em = fixture.Create<TreeX>();

        // Assert
        em.Should().NotBeNull();
    }
}

Работает нормально, когда у меня есть классы, определенные следующим образом:

class TreeX
{
    public MetaX MetaX { get; set; }

    public IReadOnlyList<TreeX> Children { get; set; }

    public TreeX OtherTreePointer { get; set; }
}

class MetaX
{
    public int A { get; set; }
}

Но когда я добавляю конструкторы и удаляю открытые сеттеры:

class TreeX
{
    public TreeX(MetaX metaX, IReadOnlyList<TreeX> children, TreeX otherTreePointer = null)
    {
        MetaX = metaX;
        Children = children;
        OtherTreePointer = otherTreePointer;
    }

    public MetaX MetaX { get; }

    public IReadOnlyList<TreeX> Children { get; }

    public TreeX OtherTreePointer { get; }
}

class MetaX
{
    public MetaX(int a)
    {
        A = a;
    }

    public int A { get; }
}

Сбой из-за следующей ошибки:

AutoFixture.ObjectCreationExceptionWithPath: AutoFixture не удалось создать экземпляр из TreeX, скорее всего, потому что у него нет открытого конструктора, является абстрактным или неоткрытый тип.

Что не очень полезно.

Также я обнаружил, что если я удаляю OtherTreePointer из TreeX, тогда он снова работает:

class TreeX
{
    public TreeX(MetaX metaX, IReadOnlyList<TreeX> children)
    {
        MetaX = metaX;
        Children = children;
    }

    public MetaX MetaX { get; }

    public IReadOnlyList<TreeX> Children { get; }
}

... но мне действительно нужно OtherTreePointer. Я не хочу переделывать свои классы, и неизменность обязательна.

Я не уверен, является ли это проблемой с библиотекой, но если нет, то как я могу заставить ее работать?

Спасибо.

...