Почему Autofixture Likeness не ведет себя так, как я ожидал бы для одного из этих двух тестов?

Учитывая эти классы:

public class DrumAndBassBand
{
    public Drums Drum { get; set; }
    public Bass Bass { get; set; }
}

public class Instrument
{
    public string Name { get; set; }
    public int SerialNumber { get; set; }
}
public class Drums : Instrument { }
public class Bass : Instrument { }

Почему этот тест проходит...

[Fact]
public void DrumAndBassBand_Equality_Behaves_As_Expected_Version_One()
{
    // arrange
    var template = new Fixture().Create<DrumAndBassBand>();

    // act
    var createdBand = new DrumAndBassBand {Drum = template.Drum, Bass = template.Bass};

    // assert         
    var createdLikeness = createdBand.AsSource().OfLikeness<DrumAndBassBand>()
        .Without(x => x.Bass)
        .CreateProxy();
    createdLikeness.Drum = createdBand.Drum;

    Assert.True(createdLikeness.Equals(template));

    var templateLikeness = template.AsSource().OfLikeness<DrumAndBassBand>()
        .Without(x => x.Bass)
        .CreateProxy();
    templateLikeness.Drum = template.Drum;

    Assert.True(templateLikeness.Equals(createdBand));
}

... а этот провал? (разница в том, DrumAndBaseBand конкретизация)

[Fact]
public void DrumAndBassBand_Equality_Behaves_As_Expected_Version_Two()
{
    // arrange
    var template = new Fixture().Create<DrumAndBassBand>();

    // act
    var createdBand =
        new DrumAndBassBand
        {
            Drum = new Drums { Name = template.Drum.Name, SerialNumber = template.Drum.SerialNumber },
            Bass = new Bass { Name = template.Bass.Name, SerialNumber = template.Bass.SerialNumber }
        };

    // assert
    var createdLikeness = createdBand.AsSource().OfLikeness<DrumAndBassBand>()
        .Without(x => x.Bass)
        .CreateProxy();
    createdLikeness.Drum = createdBand.Drum;

    Assert.True(createdLikeness.Equals(template));

    var templateLikeness = template.AsSource().OfLikeness<DrumAndBassBand>()
        .Without(x => x.Bass)
        .CreateProxy();
    templateLikeness.Drum = template.Drum;

    Assert.True(templateLikeness.Equals(createdBand));
}

1 ответ

Решение

Во втором тесте Drum а также Bass экземпляры отличаются от шаблона, в котором вы пытаетесь сравнить.

Вы всегда можете запустить Likeness (без создания прокси) и проверьте вывод:

Test 'DrumAndBassBand_Equality_Behaves_As_Expected_Version_Two' failed: 

Ploeh.SemanticComparison.LikenessException:
    The provided value DrumAndBassBand did not match the expected value DrumAndBassBand. 

The following members did not match: 
- Drum.

Это в основном означает, что вы должны предоставить подсказку при создании Likeness для сравнения Drum пример.

Первая половина теста становится:

var createdLikeness = createdBand
    .AsSource().OfLikeness<DrumAndBassBand>()
    .With(x => x.Drum)
        .EqualsWhen((s, d) => s.Drum == createdBand.Drum)
    .Without(x => x.Bass)
    .CreateProxy();

Исходный пункт назначения Drums равно другой Drums когда это действительно экземпляр madeBand Drum,

Точно так же вторая половина теста становится:

var templateLikeness = template
    .AsSource().OfLikeness<DrumAndBassBand>()
    .With(x => x.Drum)
        .EqualsWhen((s, d) => s.Drum == template.Drum)
    .Without(x => x.Bass)
    .CreateProxy();

Вышесказанное позволяет вам иметь очень гибкие сравнения (и вы всегда можете настроить его еще дальше).

Другие вопросы по тегам