Почему не пройти простой тест с использованием AutoFixture Freeze, SemanticComparison Likeness и CreateProxy?
Я пытаюсь понять, как использовать CreateProxy()
особенность Likeness<T>()
используя два экземпляра простого класса.
public class Band
{
public string Strings { get; set; }
public string Brass { get; set; }
}
В следующем тесте я использую Fixture
в Create<T>
Band
экземпляр со значениями для двух строковых свойств.
[Fact]
public void Equality_Behaves_As_Expected()
{
// arrange
var fixture = new Fixture();
fixture.Customize(new AutoMoqCustomization());
var original = fixture.Create<Band>();
// Brass something like --> "Brass65756b89-d9f3-42f8-88fc-ab6de5ae65cd"
// Strings something like --> "Strings7439fa1b-014d-4544-8428-baea66858940"
// act
var dupe = new Band {Brass = original.Brass,
Strings = original.Strings};
// Brass same as original's like --> "Brass65756b89-d9f3-42f8-88fc-ab6de5ae65cd"
// Strings same as original's like --> "Strings7439fa1b-014d-4544-8428-baea66858940"
Я пробовал много разных утверждений, но суть дела, кажется, в том, что CreateProxy
Метод не заполняет свойства Band
так что даже когда я пытаюсь сравнить два экземпляра Band
с теми же значениями свойств, экземпляр из CreateProxy
Метод всегда имеет нулевые значения.
// assert
var likeness = dupe.AsSource().OfLikeness<Band>()
.Without(x => x.Brass).CreateProxy();
// Brass & String properties are null using dupe as source of likeness (!)
//var likeness = original.AsSource().OfLikeness<Band>()
// .Without(x => x.Brass).CreateProxy();
// Brass & String properties are null using original as source of likeness (!)
//Assert.True(likeness.Equals(original)); // Fails
//Assert.True(original.Equals(likeness)); // Fails
// below are using FluentAssertions assembly
//likeness.Should().Be(original); // Fails (null properties)
//original.Should().Be(likeness); // Fails (null properties)
//likeness.ShouldBeEquivalentTo(original); // Fails (null properties)
//original.ShouldBeEquivalentTo(likeness); // Fails (null properties)
}
Я должен делать что-то не так, но я прочитал все, что я могу найти в блоге Ploeh и SO, и не могу найти достаточно простой пример, чтобы сравнить с тем, что я делаю. Есть идеи?
1 ответ
Если вы назначите значения в проксируемый экземпляр (после вызова CreateProxy
метод) тест проходит:
[Fact]
public void Equality_Behaves_As_Expected()
{
// AutoMoqCustomization is not necessary.
var original = new Fixture().Create<Band>();
var likeness = original
.AsSource()
.OfLikeness<Band>()
.Without(x => x.Brass)
.CreateProxy();
likeness.Brass = "foo"; // Ignored.
likeness.Strings = original.Strings;
Assert.True(likeness.Equals(original));
likeness.Should().Be(original);
likeness.ShouldBeEquivalentTo(original);
}
Имейте в виду, что Likeness
создает прокси для целевого типа, и только экземпляр этого типа переопределяет Equals
,
Поскольку тип источника остается неизменным, следующие утверждения не будут выполнены:
Assert.True(original.Equals(likeness));
original.Should().Be(likeness);
original.ShouldBeEquivalentTo(likeness);
Обновить
Начиная с версии 3.0.4 и выше значения автоматически копируются в экземпляр прокси (что означает, likeness.Strings = original.Strings;
произойдет автоматически).