Autofixture: Dapatkan instance Antarmuka dalam yang dibuat oleh AutoMoqData.

Dibuat pada 26 Apr 2018  ·  8Komentar  ·  Sumber: AutoFixture/AutoFixture

Hai,

Saya mencoba untuk mendapatkan instance dari Antarmuka Mocked bagian dalam yang dibuat oleh AutoMoqData untuk mengatur antarmuka.

Apakah ada cara untuk melakukan sesuatu seperti ini

[Theory, AutoMoqData]
public void Dummy(IFixture fixture, ComplexClassWithInnerInterface sut)
{
    fixture.GetInstance<IInnerInterfaceMockCreatedByAutoMoqData>().Setup(x => x.Method).Result(something);

    Assert.Equal(String.Empty, String.Empty);
}

Terima kasih

question

Komentar yang paling membantu

Terima kasih @xlecoustillier atas jawaban yang bagus. Pada dasarnya, saya menyarankan untuk melakukan hal yang sama karena saya terus-menerus mengikuti pola ini dalam pengujian saya.

Tetapi untuk 30 antarmuka, cukup jelek untuk memilikinya dalam parameter metode.

Nah, argumen ini terlihat agak aneh. Mungkin, ada yang salah dengan desain kode yang diuji jika Anda perlu mengonfigurasi 30 dependensi untuk membuat skenario Saya 99% @ploeh akan menyarankan Anda untuk meninjau kode terlebih dahulu sebelum melanjutkan lebih jauh, sesuai sarannya, disarankan untuk memiliki maks 3-4 dependensi

Jadi sepertinya tidak mungkin untuk mendapatkan tiruan yang dibuat secara otomatis dari wadah perlengkapan. Mereka tidak disuntikkan secara default jadi jika perlengkapan memiliki metode seperti GetInstance, itu tidak akan mengembalikan apa pun untuk tiruan yang dibuat secara otomatis.

Saya tidak 100% yakin saya memahami seluruh pesan dengan jelas, tetapi dari apa yang saya dapatkan Anda benar. Secara default semua objek yang dihasilkan bersifat sementara dan fixture tidak mempertahankannya. Jika Anda ingin membuat objek tertentu menjadi tunggal, Anda harus menggunakan atribut fixture.Freeze<>() API atau [Frozen] atau API lain yang sesuai.
Perilaku default yang ada dirancang untuk mencakup skenario umum dan dalam banyak kasus Anda _tidak ingin_ memiliki objek yang sama per jenis.

Jika Anda masih mencari bantuan dari pihak kami, berikan persyaratan yang lebih tepat yang Anda miliki. Lebih baik, bagikan kode yang cukup untuk menunjukkan batasan dan tujuan saat ini yang ingin Anda capai - yang akan membantu menyinkronkan dengan lebih baik

Terima kasih.

Semua 8 komentar

mencoba

Mock.Get(sut).Setup(x => x.Method).Result(something);

Anda akan mendapatkan instance Object tidak dibuat oleh Moq. mengakses sut.

Ini benar-benar akan berfungsi jika antarmuka berada di properti publik.
Mock.Get(sut.InnerInterface).Setup(x => x.Method).Hasil (sesuatu);

Tetapi bagaimana jika antarmuka diejek dan konstruktor disuntikkan, terdaftar di wadah IoC tetapi tidak dapat diakses di sut dengan properti publik?

Dalam hal ini Anda harus membekukan tiruan untuk memastikan bahwa instance yang Anda hasilkan juga akan disuntikkan ke sut:

[Theory, AutoMoqData]
public void Dummy(
    IFixture fixture, 
    [Frozen]Mock<YourInnerInterface> innerInterfaceMock,
    ComplexClassWithInnerInterface sut)
{
    innerInterfaceMock.Setup(x => x.Method).Result(something);
    sut.DoSomething();
    Assert.Equal(String.Empty, String.Empty);
}

Berhati-hatilah untuk selalu membuat tiruan beku sebelum jahitan sehingga sudah ada saat jahitan dibuat dan karena itu disuntikkan dengan benar.

Lihat blog ploeh untuk referensi.

Hai,
Saya sudah melakukan itu. Tetapi untuk 30 antarmuka, cukup jelek untuk memilikinya dalam parameter metode.
Kode Anda mengingatkan saya bahwa AutoMoqData tidak membekukan semua antarmuka tiruan. Jadi sepertinya tidak mungkin untuk mendapatkan tiruan yang dibuat secara otomatis dari wadah perlengkapan. Mereka tidak disuntikkan secara default jadi jika perlengkapan memiliki metode seperti GetInstance, itu tidak akan mengembalikan apa pun untuk tiruan yang dibuat secara otomatis. Itu sebabnya saya mendapatkan duplikat jika saya membekukan tiruan dengan contoh perlengkapan. Satu-satunya cara saya melihat Ini akan berhasil adalah jika sut dapat diperbarui dengan tiruan yang dibekukan nanti, tetapi itu akan jelek. Cara mudahnya adalah menggunakan AutoMoqData untuk membuat IFixture, membekukan, dan menyiapkan tiruan dalam metode pengujian, lalu membuat sut. Dengan pengaturan ini saya dapat membuat metode pembantu yang dapat digunakan kembali untuk membekukan dan mengatur tiruan.

Terima kasih

Terima kasih @xlecoustillier atas jawaban yang bagus. Pada dasarnya, saya menyarankan untuk melakukan hal yang sama karena saya terus-menerus mengikuti pola ini dalam pengujian saya.

Tetapi untuk 30 antarmuka, cukup jelek untuk memilikinya dalam parameter metode.

Nah, argumen ini terlihat agak aneh. Mungkin, ada yang salah dengan desain kode yang diuji jika Anda perlu mengonfigurasi 30 dependensi untuk membuat skenario Saya 99% @ploeh akan menyarankan Anda untuk meninjau kode terlebih dahulu sebelum melanjutkan lebih jauh, sesuai sarannya, disarankan untuk memiliki maks 3-4 dependensi

Jadi sepertinya tidak mungkin untuk mendapatkan tiruan yang dibuat secara otomatis dari wadah perlengkapan. Mereka tidak disuntikkan secara default jadi jika perlengkapan memiliki metode seperti GetInstance, itu tidak akan mengembalikan apa pun untuk tiruan yang dibuat secara otomatis.

Saya tidak 100% yakin saya memahami seluruh pesan dengan jelas, tetapi dari apa yang saya dapatkan Anda benar. Secara default semua objek yang dihasilkan bersifat sementara dan fixture tidak mempertahankannya. Jika Anda ingin membuat objek tertentu menjadi tunggal, Anda harus menggunakan atribut fixture.Freeze<>() API atau [Frozen] atau API lain yang sesuai.
Perilaku default yang ada dirancang untuk mencakup skenario umum dan dalam banyak kasus Anda _tidak ingin_ memiliki objek yang sama per jenis.

Jika Anda masih mencari bantuan dari pihak kami, berikan persyaratan yang lebih tepat yang Anda miliki. Lebih baik, bagikan kode yang cukup untuk menunjukkan batasan dan tujuan saat ini yang ingin Anda capai - yang akan membantu menyinkronkan dengan lebih baik

Terima kasih.

Ya, saya akan menyarankan bahwa 30 dependensi terlalu banyak.

Mengenai mendapatkan dependensi yang disuntikkan, menggunakan atribut [Frozen] , seperti yang disarankan @xlecoustillier , adalah salah satu opsi, dan sebenarnya alasan atribut itu awalnya ada.

Menggunakan Mock.Get(sut.Dep1) juga merupakan opsi yang sering saya gunakan.

Tetapi bagaimana jika antarmuka [...] konstruktor disuntikkan [...] tetapi tidak dapat diakses di sut dengan properti publik?

Mengapa tidak mengeksposnya sebagai properti? Apa yang Anda tulis, Anda juga dapat mengekspos. . Itu tidak merusak enkapsulasi untuk mengeksposnya.

Saya merasa ingin menambahkan @ploeh dengan menentukan bahwa pendekatan terbaik adalah mengekspos dependensi sebagai properti kelas tanpa memperkaya abstraksi Anda yang tidak lebih dari membocorkan implementasi Anda!

@malyemire1 Menutup ini karena sepertinya tidak diperlukan bantuan lebih lanjut. Beri tahu kami jika ada hal lain yang dapat kami bantu

Terima kasih untuk sekali lagi untuk mengajukan pertanyaan! 👍

Apakah halaman ini membantu?
0 / 5 - 0 peringkat