Autofixture のCreateProxy メソッド に関する以前の質問で、潜在的なバグが特定されました。
この失敗したテストはその結果ではないと思いますが、むしろ Likeness.Without(...).CreateProxy() 構文がどのように機能するかについての私の継続的な混乱です。オブジェクトの新しいインスタンスを作成し、その作成がSUTであると見なして、元のテスト を少しだけ複雑にする次の失敗したテストを考えてみましょう。
[Fact]
public void Equality_Behaves_As_Expected()
{
// arrange: intent -> use the fixture-created Band as Object Mother
var template = new Fixture().Create<Band>();
// act: intent -> instantiated Band *is* the SUT
var createdBand = new Band {Brass = template.Brass,
Strings = template.Brass};
// intent -> specify that .Brass should not be considered in comparison
var likeness = template.AsSource().OfLikeness<Band>().
Without(x => x.Brass).CreateProxy(); // Ignore .Brass property
// per [https://stackoverflow.com/a/15476108/533958] explicity assign
// properties to likeness
likeness.Strings = template.Strings;
likeness.Brass = "foo"; // should be ignored
// assert: intent -> check equality between created Band & template Band
// to include all members not excluded in likeness definition
likeness.Should().Be(createdBand); // Fails
likeness.ShouldBeEquivalentTo(createdBand); // Fails
Assert.True(likeness.Equals(createdBand)); // Fails
}
ここにバンドがあります:
public class Band
{
public string Strings { get; set; }
public string Brass { get; set; }
}
私の以前の質問Source
は、 が一般的にどうあるLikeness
べきかを理解するのに役立つほど複雑ではありませんでした。
ソースはSUTの出力である必要がありますか? その場合、AutoFixture によって作成されたテンプレートインスタンスと比較されますか?
または、ソースはAutoFixture によって作成されたテンプレートインスタンスである必要があります。その場合、 SUTの出力と比較されますか?
編集:テストのエラーを修正
プロパティをと新しいインスタンスのtemplate.Brass
プロパティの両方に誤って割り当てたことに気付きました。更新されたテストは修正を反映しており、6 つのアサーションすべてがパスするようになりました。Brass
Strings
Band
var createdBand = new Band {Brass = template.Brass, Strings = template.Strings}
[Fact]
public void Equality_Behaves_As_Expected()
{
// arrange: intent -> use the fixture-created Band as Object Mother
var template = new Fixture().Create<Band>();
// act: intent -> instantiated Band *is* the SUT
var createdBand = new Band {Brass = template.Brass, Strings = template.Strings};
// likeness of created
var createdLikeness = createdBand.AsSource().OfLikeness<Band>().
Without(x => x.Brass).CreateProxy(); // .Brass should not be considered in comparison
// https://stackoverflow.com/a/15476108/533958 (explicity assign properties to likeness)
createdLikeness.Strings = createdBand.Strings;
createdLikeness.Brass = "foo"; // should be ignored
// likeness of template
var templateLikeness = template.AsSource().OfLikeness<Band>()
.Without(x => x.Brass)
.CreateProxy();
templateLikeness.Strings = template.Strings;
templateLikeness.Brass = "foo";
// assert: intent -> compare created Band to template Band
createdLikeness.Should().Be(template);
createdLikeness.ShouldBeEquivalentTo(template);
Assert.True(createdLikeness.Equals(template));
templateLikeness.Should().Be(createdBand);
templateLikeness.ShouldBeEquivalentTo(createdBand);
Assert.True(templateLikeness.Equals(createdBand));
}