فشل الاختبار التالي:
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 لا تعمل.
هل هو سلوك متوقع؟
وإذا كانت الإجابة بنعم ، ألا يجب إضافتها إلى بعض الوثائق؟ لقد ضيعت الكثير من الوقت في اكتشاف الخطأ ...
@ progala2 شكرا لطرح السؤال.
السلوك الحالي حسب التصميم. والسبب هو أن الأساليب FromFactory
و With
(و Without
) غير قابلة للتغيير ، لذا فهي لا تغير الكائن الأساسي. بدلاً من ذلك ، يقومون بإرجاع كائن جديد برسم بياني مهيأ.
سبب عدم نجاح الاختبار الأول هو أنك لا تستخدم نتيجة الاستدعاءات ، لذلك يتم تجاهل جميع التغييرات المطبقة. بمجرد إعادة كتابة الشفرة بشكل صحيح ، ستعمل بشكل جيد مع العبارات أيضًا:
ج #
[حقيقة]
اختبار الفراغ العام 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 _));
}
أرى أنها غير قابلة للتغيير - الأمر واضح الآن.
شكرا لإجابتك وبعض النصائح الإضافية!