Autofixture: FromFactory لا يعمل على النحو المنشود

تم إنشاؤها على ٢٦ أكتوبر ٢٠١٧  ·  3تعليقات  ·  مصدر: AutoFixture/AutoFixture

أهلا،

ج #
[تثبيت إختبار]
فئة عامة 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"));
    }
}

""

فشل هذا الاختبار في استخدام 4.0.0-rc1 على .NET Core 2
أعتقد أن هذا إما مضلل (أو موثق بشكل سيئ) أو معطل .
تحرير: لم يتم كسرها ، انظر التعليقات أدناه.

question

التعليق الأكثر فائدة

حسنًا ، من المحتمل أن تكون مشكلة في وثائقنا ☺️

بشكل افتراضي ، يملأ AutoFixture الخصائص تلقائيًا بالمحددات العامة ، إلا إذا قمت بتعطيل هذا السلوك عن طريق تعيين fixture.OmitAutoProperties = true . تتيح لك الطريقة composer.FromFactory() تحديد كيفية تنشيط مثيل من النوع المعين ، ومع ذلك سيستمر تخصيص الخصائص للكائن لاحقًا.

في الواقع ، يعتمد الاستخدام المناسب لواجهة برمجة تطبيقات AutoFixture على السيناريو. الاستخدام الأكثر "اصطلاحيًا" في السيناريو أعلاه سيكون كما يلي:

ج #
و. تخصيص(ج => ج
.FromFactory (() => جديد TestClass ())
. مع (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"));

بدلاً من ذلك ، يمكنك ببساطة تعطيل تعبئة الخصائص التلقائية إذا كنت بحاجة إلى ذلك:
ج #
و. تخصيص(ج => ج
.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" });

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

يُرجى إعلامي إذا كان لا يزال لديك بعض الأسئلة لتوضيحها وسأساعدك بكل سرور.

ملاحظة: قد تساعد الروابط التالية أيضًا:

PPS السبب وراء عمل composer.Without(x => x.Property) هو أن هذا التعبير يعطل الخصائص التلقائية لخاصية / حقل معين. في هذه الحالة ، لا يتجاوز AutoFixture القيمة الأولية للكائن بالقيمة التي تم إنشاؤها تلقائيًا.

ال 3 كومينتر

لقد لاحظت أنه إذا أضفت .Without(_ => _.Property) بعد طريقة FromFactory فإنه يعمل على النحو المنشود.
أعتقد أن هذا أمر بديهي للغاية ولكن نظرًا لأنه ليس خطأ ، يمكننا إغلاق هذا.

حسنًا ، من المحتمل أن تكون مشكلة في وثائقنا ☺️

بشكل افتراضي ، يملأ AutoFixture الخصائص تلقائيًا بالمحددات العامة ، إلا إذا قمت بتعطيل هذا السلوك عن طريق تعيين fixture.OmitAutoProperties = true . تتيح لك الطريقة composer.FromFactory() تحديد كيفية تنشيط مثيل من النوع المعين ، ومع ذلك سيستمر تخصيص الخصائص للكائن لاحقًا.

في الواقع ، يعتمد الاستخدام المناسب لواجهة برمجة تطبيقات AutoFixture على السيناريو. الاستخدام الأكثر "اصطلاحيًا" في السيناريو أعلاه سيكون كما يلي:

ج #
و. تخصيص(ج => ج
.FromFactory (() => جديد TestClass ())
. مع (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"));

بدلاً من ذلك ، يمكنك ببساطة تعطيل تعبئة الخصائص التلقائية إذا كنت بحاجة إلى ذلك:
ج #
و. تخصيص(ج => ج
.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" });

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

يُرجى إعلامي إذا كان لا يزال لديك بعض الأسئلة لتوضيحها وسأساعدك بكل سرور.

ملاحظة: قد تساعد الروابط التالية أيضًا:

PPS السبب وراء عمل composer.Without(x => x.Property) هو أن هذا التعبير يعطل الخصائص التلقائية لخاصية / حقل معين. في هذه الحالة ، لا يتجاوز AutoFixture القيمة الأولية للكائن بالقيمة التي تم إنشاؤها تلقائيًا.

شكرا جزيلا على هذه الإجابة الرائعة لك! أنت مدهش :)

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

DeafLight picture DeafLight  ·  5تعليقات

ecampidoglio picture ecampidoglio  ·  7تعليقات

zvirja picture zvirja  ·  3تعليقات

ploeh picture ploeh  ·  7تعليقات

Ridermansb picture Ridermansb  ·  4تعليقات