3

AutoFixture が凍結されたモックのプロパティを上書きしているように見えるという問題があります。モックされたクラスのプロパティは読み取り専用であり、私が読んだことから、AutoFixture はそれに対して何もしようとすべきではありません。

以下のLINQPadで問題を再現するためのコードを含めました。Victim2 つの読み取り専用プロパティを持つ単純なテスト クラスです。問題は、Thingsプロパティの期待値を設定Objectし、型を返す AutoFixture のインスタンスとしてモックを登録するVictimと、コレクションThingsに異なる文字列が含まれることです。

問題を再現するには、LINQPad で以下のコードをC# プログラムとして実行し、NuGet からAutoFixtureMoqを参照します。名前空間MoqPloeh.AutoFixtureを必ず含めてください。

私の期待は、登録したオブジェクトを取得し、返されたのRegisterコレクションが への呼び出しで参照したコレクションを返すことです。ThingsVictimSetupGet

public class Victim
{
    private string _vic;
    private IEnumerable<string> _things;
    public virtual string VictimName { get { return _vic; } }
    public virtual IEnumerable<string> Things { get { return _things; } }
}

void Main()
{
    var fixture = new Fixture();
    var victimName = fixture.CreateAnonymous("VIC_");
    var things = fixture.CreateMany<string>();
    victimName.Dump("Generated vic name");
    things.Dump("Generated things");

    var victimMock = fixture.Freeze<Mock<Victim>>();
    victimMock.SetupGet(x => x.VictimName).Returns(victimName).Verifiable();
    victimMock.SetupGet(x => x.Things).Returns(things).Verifiable();
    fixture.Register(() => victimMock.Object);

    var victim = fixture.CreateAnonymous<Victim>();
    (victim.Equals(victimMock.Object)).Dump("Victims are the same?");
    victim.VictimName.Dump("Returned name");
    victim.Things.Dump("Returned things");
    (things.Equals(victim.Things)).Dump("Returned things are the same?");

    victimMock.Verify();
}
4

1 に答える 1

4

私の推測では、IteratorThings実際には同じですが、それが生成する文字列は異なります。これは実際には設計によるものですが、これが特に優れた設計上の決定ではなかったことが後でわかりました。

AutoFixture 3では、この動作が変更されました。

私の推測が正しければ、この問題は AutoFixture 3 で解消されます。AutoFixture 2 では、次のようなフィクスチャを作成することで解決できるはずです。

var fixture = new Fixture().Customize(new StableMultipeCustomization());
于 2013-02-20T22:15:34.120 に答える