Autofixture: FromFactoryが意図したとおりに機能しない

作成日 2017年10月26日  ·  3コメント  ·  ソース: AutoFixture/AutoFixture

やあ、

`` `C#
[テストフィクスチャ]
パブリッククラスTestAutoFixture {

    public class TestClass
    {
        public string Property { get; set; }
    }

    [Test]
    public void Test()
    {
        var f = new Fixture();
        f.Customize<TestClass>(composer => composer.FromFactory(() => new TestClass { Property = "foobar" }));

        var o = f.Create<TestClass>();

        Assert.That(o.Property, Is.EqualTo("foobar"));
    }
}

`` `

このテストは、.NET Core2で4.0.0-rc1を使用すると失敗します
これは誤解を招く(または十分に文書化されていない)か、壊れていると思います。
編集:それは壊れていません、以下のコメントを参照してください。

question

最も参考になるコメント

まあ、それは私たちのドキュメントの問題である可能性があります☺️

デフォルトでは、AutoFixtureは、 fixture.OmitAutoProperties = true設定してその動作を無効にしない限り、プロパティにパブリックセッターを自動的に入力します。 composer.FromFactory()メソッドを使用すると、特定のタイプのインスタンスをアクティブ化する方法を指定できますが、プロパティは後でオブジェクトに割り当てられます。

実際、適切なAutoFixtureAPIの使用法はシナリオによって異なります。 上記のシナリオで最も「慣用的な」使用法は次のとおりです。

`` `c#
f。カスタマイズ(c => c
.FromFactory(()=> new TestClass())
.With(x => x.Property、 "foobar"));

or even the simplified one as AutoFixture will automatically pick up that constructor:
```c#
f.Customize<TestClass>(c => c
    .With(x => x.Property, "foobar"));

または、必要に応じて、プロパティの自動入力を無効にすることもできます。
`` `c#
f。カスタマイズ(c => c
.FromFactory(()=> new TestClass {Property = "foobar"})
.OmitAutoProperties());

However, in this case, probably, the `Customize<>()` API is an overhead. Instead, it's simpler to use the `fixture.Register()` method as it allows to use the constructed instance "as-is" without any post-processing:

```c#
f.Register(() => new TestClass { Property = "foobar" });

最初はどの正確なAPIが適しているかを理解するのは混乱するかもしれませんが、後で簡単になるはずです😉このすべてのAPIは柔軟性を提供し、さまざまなシナリオでさまざまなオプションがより良く見えます。

ご不明な点がございましたら、お気軽にお問い合わせください。喜んでお手伝いさせていただきます。

PS次のリンクも役立つ場合があります。

PPS composer.Without(x => x.Property)機能する理由は、この式が特定のプロパティ/フィールドの自動プロパティを無効にするためです。 その場合、AutoFixtureはオブジェクトの初期値を自動生成された値でオーバーライドしません。

全てのコメント3件

FromFactoryメソッドの後に.Without(_ => _.Property)を追加すると、意図したとおりに機能することに気付きました。
これは非常に直感に反すると思いますが、バグではないので、これを閉じることができます。

まあ、それは私たちのドキュメントの問題である可能性があります☺️

デフォルトでは、AutoFixtureは、 fixture.OmitAutoProperties = true設定してその動作を無効にしない限り、プロパティにパブリックセッターを自動的に入力します。 composer.FromFactory()メソッドを使用すると、特定のタイプのインスタンスをアクティブ化する方法を指定できますが、プロパティは後でオブジェクトに割り当てられます。

実際、適切なAutoFixtureAPIの使用法はシナリオによって異なります。 上記のシナリオで最も「慣用的な」使用法は次のとおりです。

`` `c#
f。カスタマイズ(c => c
.FromFactory(()=> new TestClass())
.With(x => x.Property、 "foobar"));

or even the simplified one as AutoFixture will automatically pick up that constructor:
```c#
f.Customize<TestClass>(c => c
    .With(x => x.Property, "foobar"));

または、必要に応じて、プロパティの自動入力を無効にすることもできます。
`` `c#
f。カスタマイズ(c => c
.FromFactory(()=> new TestClass {Property = "foobar"})
.OmitAutoProperties());

However, in this case, probably, the `Customize<>()` API is an overhead. Instead, it's simpler to use the `fixture.Register()` method as it allows to use the constructed instance "as-is" without any post-processing:

```c#
f.Register(() => new TestClass { Property = "foobar" });

最初はどの正確なAPIが適しているかを理解するのは混乱するかもしれませんが、後で簡単になるはずです😉このすべてのAPIは柔軟性を提供し、さまざまなシナリオでさまざまなオプションがより良く見えます。

ご不明な点がございましたら、お気軽にお問い合わせください。喜んでお手伝いさせていただきます。

PS次のリンクも役立つ場合があります。

PPS composer.Without(x => x.Property)機能する理由は、この式が特定のプロパティ/フィールドの自動プロパティを無効にするためです。 その場合、AutoFixtureはオブジェクトの初期値を自動生成された値でオーバーライドしません。

この信じられないほどの答えをどうもありがとう! あなたが素晴らしいです :)

このページは役に立ちましたか?
0 / 5 - 0 評価

関連する問題

zvirja picture zvirja  ·  8コメント

zvirja picture zvirja  ·  4コメント

Accc99 picture Accc99  ·  4コメント

DeafLight picture DeafLight  ·  5コメント

mjfreelancing picture mjfreelancing  ·  4コメント