Autofixture: التخصيص مع بيان لامدا لا يعمل - هل هو متوقع؟

تم إنشاؤها على ٧ يونيو ٢٠١٨  ·  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;
        }
    }

يتم ملء معلمة التحكم بسلسلة عشوائية بدلاً من عدد صحيح يتم إنشاؤه.

الإصدار 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 _));
        }

يبدو أن التخصيص باستخدام عبارة lambda لا تعمل.
هل هو سلوك متوقع؟
وإذا كانت الإجابة بنعم ، ألا يجب إضافتها إلى بعض الوثائق؟ لقد ضيعت الكثير من الوقت في اكتشاف الخطأ ...

question

ال 2 كومينتر

@ progala2 شكرا لطرح السؤال.

السلوك الحالي حسب التصميم. والسبب هو أن الأساليب FromFactory و WithWithout ) غير قابلة للتغيير ، لذا فهي لا تغير الكائن الأساسي. بدلاً من ذلك ، يقومون بإرجاع كائن جديد برسم بياني مهيأ.

سبب عدم نجاح الاختبار الأول هو أنك لا تستخدم نتيجة الاستدعاءات ، لذلك يتم تجاهل جميع التغييرات المطبقة. بمجرد إعادة كتابة الشفرة بشكل صحيح ، ستعمل بشكل جيد مع العبارات أيضًا:

ج #
[حقيقة]
اختبار الفراغ العام 1 ()
{
var fixture = تركيبات جديدة () ؛
المباراة(ج =>
{
// بيان لامدا
var res = c.FromFactory (() => new PaymentReturnPayload (fixture.Create)().إلى سلسلة()))؛
الدقة = 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 التقييمات