Autofixture: ステートメントでカスタマイズラムダは機能しません-それは期待されていますか?

作成日 2018年06月07日  ·  2コメント  ·  ソース: AutoFixture/AutoFixture

次のテストは失敗します。

public class UnitTest1
    {
        [Fact]
        public void Test1()
        {
            var fixture = new Fixture();
            fixture.Customize<PaymentReturnPayload>(c =>
            { // a statement lambda
                c.With(a => a.OperationAmount, "1");
                c.FromFactory(() => new PaymentReturnPayload(fixture.Create<int>().ToString()));
                return c;
            });
            var paymentReturnPayload = fixture.Create<PaymentReturnPayload>();
            Assert.True(int.TryParse(paymentReturnPayload.Control, out _));
        }
    }

    public class PaymentReturnPayload
    {
        public PaymentReturnPayload(string control)
        {
            Control = control;
        }

        public string OperationAmount { get; set; }

        public string Control
        {
            get;
        }
    }

Controlパラメーターには、生成されたintではなくランダムな文字列が入力されます。

バージョン4.0-4.4(以前のものはテストしていません)
ネットコア2.0-2.1

これはうまくいきます

[Fact]
        public void Test1()
        {
            var fixture = new Fixture();
            fixture.Customize<PaymentReturnPayload>(c =>
                c.FromFactory(() => new PaymentReturnPayload(fixture.Create<int>().ToString())));
            var paymentReturnPayload = fixture.Create<PaymentReturnPayload>();
            Assert.True(int.TryParse(paymentReturnPayload.Control, out _));
        }

ステートメントラムダを使用したカスタマイズは機能しないようです。
それは予想される動作ですか?
はいの場合、それをいくつかのドキュメントに追加するべきではありませんか? 私は何が悪いのかを理解するのに多くの時間を失いました...

question

全てのコメント2件

@ progala2質問をしてくれてありがとう。

既存の動作は仕様によるものです。 その理由は、 FromFactoryWith (およびWithout )メソッドは不変であるため、基になるオブジェクトを変更しないためです。 代わりに、構成されたグラフを持つ新しいオブジェクトを返します。

最初のテストが機能しない理由は、呼び出しの結果を使用しないため、適用されたすべての変更が破棄されるためです。 コードを正しく書き直すと、ステートメントでも正常に機能します。

`` `c#
[事実]
public void Test1()
{{
varfixture = new Fixture();
フィクスチャ。カスタマイズ(c =>
{{
//ステートメントラムダ
var res = c.FromFactory(()=> new PaymentReturnPayload(fixture.Create().ToString()));
res = res.With(a => a.OperationAmount、 "1");
解像度を返します。
});

var paymentReturnPayload = fixture.Create<PaymentReturnPayload>();
Assert.True(int.TryParse(paymentReturnPayload.Control, out _));

}


But as you might notice, it's easier to write this code with lambda.

P.S. By the way, you can slightly improve the final code (notice the `FromFactory` has overload taking extra values necessary for the object construction):
```c#
[Fact]
public void Test3()
{
    var fixture = new Fixture();
    fixture.Customize<PaymentReturnPayload>(c =>
        c.FromFactory((int control) => new PaymentReturnPayload(control.ToString())));

    var paymentReturnPayload = fixture.Create<PaymentReturnPayload>();
    Assert.True(int.TryParse(paymentReturnPayload.Control, out _));
}

なるほど、それらは不変です-今でははっきりしています。
あなたの答えといくつかの追加のヒントをありがとう!

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

関連する問題

ploeh picture ploeh  ·  3コメント

joelleortiz picture joelleortiz  ·  4コメント

Ridermansb picture Ridermansb  ·  4コメント

Accc99 picture Accc99  ·  4コメント

zvirja picture zvirja  ·  4コメント