Autofixture: FromFactory tidak berfungsi sebagaimana dimaksud

Dibuat pada 26 Okt 2017  ·  3Komentar  ·  Sumber: AutoFixture/AutoFixture

Hai,

```C#
[Perlengkapan Tes]
TestAutoFixture kelas publik {

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

```

Tes ini gagal menggunakan 4.0.0-rc1 di .NET Core 2
Saya pikir ini menyesatkan (atau tidak terdokumentasi dengan baik) atau rusak .
EDIT: Tidak rusak, lihat komentar di bawah.

question

Komentar yang paling membantu

Yah, kemungkinan ada masalah dengan dokumentasi kami ️

Secara default, AutoFixture secara otomatis mengisi properti dengan setter publik, kecuali jika Anda menonaktifkan perilaku itu dengan menyetel fixture.OmitAutoProperties = true . Metode composer.FromFactory() memungkinkan Anda untuk menentukan cara mengaktifkan instance dari tipe tertentu, namun properti akan tetap ditetapkan untuk objek nanti.

Sebenarnya, penggunaan AutoFixture API yang tepat tergantung pada skenario. Penggunaan paling "idiomatik" dalam skenario di atas adalah sebagai berikut:

```c#
f.Sesuaikan(c => c
.FromFactory(() => new TestClass())
.Dengan(x => x.Properti, "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"));

Atau, Anda cukup menonaktifkan pengisian properti otomatis jika Anda membutuhkannya:
```c#
f.Sesuaikan(c => c
.FromFactory(() => new TestClass { Properti = "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" });

Mungkin membingungkan pada awalnya untuk memahami API mana yang lebih cocok, tetapi nantinya akan lebih mudah Semua API ini memberikan fleksibilitas dan dalam skenario yang berbeda, opsi yang berbeda terlihat lebih baik.

Beri tahu saya jika Anda masih memiliki beberapa pertanyaan untuk diklarifikasi dan saya akan dengan senang hati membantu Anda.

PS Tautan berikut mungkin juga membantu:

PPS Alasan mengapa composer.Without(x => x.Property) bekerja adalah karena ekspresi ini menonaktifkan properti otomatis untuk properti/bidang tertentu. Dalam hal ini AutoFixture tidak menimpa nilai objek awal dengan yang dibuat secara otomatis.

Semua 3 komentar

Saya perhatikan bahwa jika saya menambahkan .Without(_ => _.Property) setelah metode FromFactory itu berfungsi sebagaimana mestinya.
Saya pikir ini sangat kontra intuitif tetapi karena ini bukan bug, kami dapat menutup ini.

Yah, kemungkinan ada masalah dengan dokumentasi kami ️

Secara default, AutoFixture secara otomatis mengisi properti dengan setter publik, kecuali jika Anda menonaktifkan perilaku itu dengan menyetel fixture.OmitAutoProperties = true . Metode composer.FromFactory() memungkinkan Anda untuk menentukan cara mengaktifkan instance dari tipe tertentu, namun properti akan tetap ditetapkan untuk objek nanti.

Sebenarnya, penggunaan AutoFixture API yang tepat tergantung pada skenario. Penggunaan paling "idiomatik" dalam skenario di atas adalah sebagai berikut:

```c#
f.Sesuaikan(c => c
.FromFactory(() => new TestClass())
.Dengan(x => x.Properti, "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"));

Atau, Anda cukup menonaktifkan pengisian properti otomatis jika Anda membutuhkannya:
```c#
f.Sesuaikan(c => c
.FromFactory(() => new TestClass { Properti = "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" });

Mungkin membingungkan pada awalnya untuk memahami API mana yang lebih cocok, tetapi nantinya akan lebih mudah Semua API ini memberikan fleksibilitas dan dalam skenario yang berbeda, opsi yang berbeda terlihat lebih baik.

Beri tahu saya jika Anda masih memiliki beberapa pertanyaan untuk diklarifikasi dan saya akan dengan senang hati membantu Anda.

PS Tautan berikut mungkin juga membantu:

PPS Alasan mengapa composer.Without(x => x.Property) bekerja adalah karena ekspresi ini menonaktifkan properti otomatis untuk properti/bidang tertentu. Dalam hal ini AutoFixture tidak menimpa nilai objek awal dengan yang dibuat secara otomatis.

Terima kasih banyak atas jawaban yang luar biasa ini! Anda menakjubkan :)

Apakah halaman ini membantu?
0 / 5 - 0 peringkat