Autofixture: Kustomisasi dengan pernyataan lambda tidak berfungsi - apakah itu diharapkan?

Dibuat pada 7 Jun 2018  ·  2Komentar  ·  Sumber: AutoFixture/AutoFixture

Tes berikut gagal:

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;
        }
    }

Parameter Kontrol diisi oleh string acak alih-alih int yang dihasilkan.

Versi 4.0 - 4.4 (Saya tidak menguji yang sebelumnya)
Inti bersih 2.0 - 2.1

Ini bekerja dengan baik

[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 _));
        }

Sepertinya menyesuaikan menggunakan pernyataan lambda tidak berfungsi.
Apakah itu perilaku yang diharapkan?
Dan jika ya, bukankah itu harus ditambahkan ke beberapa dokumentasi? Saya kehilangan banyak waktu untuk mencari tahu apa yang salah ...

question

Semua 2 komentar

@progala2 Terima kasih telah mengajukan pertanyaan.

Perilaku yang ada adalah dengan desain. Alasannya adalah bahwa metode FromFactory , With (dan Without ) tidak dapat diubah, sehingga tidak mengubah objek yang mendasarinya. Sebagai gantinya, mereka mengembalikan objek baru dengan grafik yang dikonfigurasi.

Alasan mengapa tes pertama tidak berhasil adalah karena Anda tidak menggunakan hasil pemanggilan, jadi semua perubahan yang diterapkan akan dibuang. Setelah Anda menulis ulang kode dengan benar, itu akan berfungsi dengan baik dengan pernyataan juga:

```c#
[Fakta]
tes1 batal publik ()
{
var perlengkapan = Perlengkapan baru();
perlengkapan. Sesuaikan(c =>
{
// pernyataan lambda
var res = c.FromFactory(() => new PaymentReturnPayload(fixture.Create().ToString()));
res = res.With(a => a.OperationAmount, "1");
kembali res;
});

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 _));
}

Saya mengerti, mereka tidak dapat diubah - itu jauh lebih jelas sekarang.
Terima kasih atas jawaban Anda dan beberapa tips tambahan!

Apakah halaman ini membantu?
0 / 5 - 0 peringkat