Pembuatan kode, kompilasi, dan konvensi penamaan di Microsoft Fakes
Artikel ini akan membahas opsi dan masalah dalam pembuatan dan kompilasi kode Fakes, dan menjelaskan konvensi penamaan untuk jenis, anggota, dan parameter yang dibuat Fakes.
Persyaratan
Visual Studio Enterprise
Proyek .NET Framework
.NET Core, .NET 5.0 atau yang lebih baru, dan proyek bergaya SDK mendukung pratinjau di Visual Studio 2019 Update 6, dan diaktifkan secara default di Update 8. Untuk informasi selengkapnya, lihat Microsoft Fakes untuk proyek bergaya SDK dan .NET Core.
Pembuatan dan kompilasi kode
Mengonfigurasi pembuatan kode stub
Pembuatan jenis stub dikonfigurasi dalam file XML yang memiliki ekstensi file .fakes. Kerangka kerja Fakes terintegrasi dalam proses build melalui tugas MSBuild kustom dan mendeteksi file tersebut pada waktu build. Pembuat kode Fakes mengompilasi jenis stub ke dalam rakitan dan menambahkan referensi ke proyek.
Contoh berikut mengilustrasikan jenis stub yang ditentukan dalam FileSystem.dll:
<Fakes xmlns="http://schemas.microsoft.com/fakes/2011/">
<Assembly Name="FileSystem"/>
</Fakes>
Pemfilteran jenis
Filter dapat diatur dalam file .fakes untuk membatasi jenis mana yang harus disandingkan. Anda dapat menambahkan jumlah elemen Hapus, Tambahkan, Hapus yang tidak terbatas di dalam elemen StubGeneration untuk menyusun daftar jenis yang dipilih.
Misalnya, file .fakes berikut menghasilkan stub untuk jenis di bawah namespace layanan Sistem dan System.IO, tetapi mengecualikan jenis apa pun yang berisi "Handel" di Sistem:
<Fakes xmlns="http://schemas.microsoft.com/fakes/2011/">
<Assembly Name="mscorlib" />
<!-- user code -->
<StubGeneration>
<Clear />
<Add Namespace="System!" />
<Add Namespace="System.IO!"/>
<Remove TypeName="Handle" />
</StubGeneration>
<!-- /user code -->
</Fakes>
String filter menggunakan tata bahasa sederhana untuk menentukan cara pencocokan harus dilakukan:
Filter tidak peka huruf besar/kecil secara default; filter melakukan pencocokan substring:
el
cocok dengan "hello"Menambahkan
!
ke akhir filter akan menjadikannya kecocokan peka huruf besar/kecil yang tepat:el!
tidak cocok dengan "hello"hello!
cocok dengan "hello"Menambahkan
*
ke akhir filter akan menjadikannya cocok dengan awalan string:el*
tidak cocok dengan "hello"he*
cocok dengan "hello"Beberapa filter dalam daftar yang dipisahkan titik koma digabungkan sebagai pembedaan:
el;wo
cocok dengan "hello" dan "world"
Kelas konkret stub dan metode virtual
Secara default, jenis stub dibuat untuk semua kelas yang tidak tertutup. Dapat membatasi jenis stub untuk mengabstraksi kelas melalui file konfigurasi .fakes:
<Fakes xmlns="http://schemas.microsoft.com/fakes/2011/">
<Assembly Name="mscorlib" />
<!-- user code -->
<StubGeneration>
<Types>
<Clear />
<Add AbstractClasses="true"/>
</Types>
</StubGeneration>
<!-- /user code -->
</Fakes>
Jenis internal
Pembuat kode Fakes membuat jenis shim dan jenis stub untuk jenis yang terlihat oleh rakitan Fakes yang dibuat. Untuk membuat jenis internal rakitan shim terlihat oleh Fakes dan rakitan pengujian Anda, tambahkan atribut InternalsVisibleToAttribute ke kode rakitan shim yang memberikan visibilitas ke rakitan Fakes yang dibuat dan ke rakitan pengujian. Berikut contohnya:
// FileSystem\AssemblyInfo.cs
[assembly: InternalsVisibleTo("FileSystem.Fakes")]
[assembly: InternalsVisibleTo("FileSystem.Tests")]
Jenis internal dalam rakitan yang bernama kuat
Jika rakitan shim dinamai dengan kuat, dan Anda ingin mengakses jenis internal rakitan:
Rakitan pengujian Anda dan rakitan Fakes harus diberi nama yang kuat.
Tambahkan kunci publik pengujian dan rakitan Fakes ke atribut InternalsVisibleToAttribute di rakitan shim. Berikut adalah tampilan contoh atribut dalam kode rakitan shim jika rakitan shim dinamai dengan kuat:
// FileSystem\AssemblyInfo.cs [assembly: InternalsVisibleTo("FileSystem.Fakes", PublicKey=<Fakes_assembly_public_key>)] [assembly: InternalsVisibleTo("FileSystem.Tests", PublicKey=<Test_assembly_public_key>)]
Jika rakitan shim dinamai dengan kuat, kerangka kerja Fakes secara otomatis menandatangani dengan kuat rakitan Fakes yang dibuat. Anda harus menandatangani dengan kuat rakitan pengujian. Lihat Rakitan bernama kuat.
Kerangka kerja Fakes menggunakan kunci yang sama untuk menandatangani semua rakitan yang dibuat, sehingga Anda dapat menggunakan cuplikan ini sebagai titik awal untuk menambahkan atribut InternalsVisibleTo untuk rakitan palsu ke kode rakitan shim Anda.
[assembly: InternalsVisibleTo("FileSystem.Fakes, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e92decb949446f688ab9f6973436c535bf50acd1fd580495aae3f875aa4e4f663ca77908c63b7f0996977cb98fcfdb35e05aa2c842002703cad835473caac5ef14107e3a7fae01120a96558785f48319f66daabc862872b2c53f5ac11fa335c0165e202b4c011334c7bc8f4c4e570cf255190f4e3e2cbc9137ca57cb687947bc")]
Anda dapat menentukan kunci publik yang berbeda untuk rakitan Fakes, seperti kunci yang telah Anda buat untuk rakitan shim, dengan menentukan jalur lengkap ke file .snk yang berisi kunci alternatif sebagai nilai atribut KeyFile
dalam elemen Fakes
\Compilation
file .fakes. Misalnya:
<-- FileSystem.Fakes.fakes -->
<Fakes ...>
<Compilation KeyFile="full_path_to_the_alternate_snk_file" />
</Fakes>
Anda kemudian harus menggunakan kunci publik file .snk alternatif sebagai parameter kedua atribut InternalVisibleTo untuk rakitan Fakes dalam kode rakitan shim:
// FileSystem\AssemblyInfo.cs
[assembly: InternalsVisibleTo("FileSystem.Fakes",
PublicKey=<Alternate_public_key>)]
[assembly: InternalsVisibleTo("FileSystem.Tests",
PublicKey=<Test_assembly_public_key>)]
Dalam contoh di atas, nilai Alternate_public_key
dan Test_assembly_public_key
bisa sama.
Mengoptimalkan waktu build
Kompilasi rakitan Fakes dapat secara signifikan meningkatkan waktu build Anda. Anda dapat meminimalkan waktu build dengan membuat rakitan Fakes untuk rakitan Sistem .NET dan rakitan pihak ketiga dalam proyek terpusat terpisah. Karena rakitan seperti itu jarang berubah pada komputer Anda, Anda dapat menggunakan kembali rakitan Fakes yang dibuat di proyek lain.
Dari proyek pengujian unit Anda, tambahkan referensi ke rakitan Fakes yang dikompilasi yang ditempatkan di dalam FakesAssemblies di folder proyek.
Buat Pustaka Kelas baru dengan versi runtime .NET yang cocok dengan proyek pengujian Anda. Sebut saja Fakes.Prebuild. Hapus file class1.cs dari proyek, tidak diperlukan.
Tambahkan referensi ke semua Sistem dan rakitan pihak ketiga yang Anda perlukan Fakes-nya.
Tambahkan file .fakes untuk setiap rakitan dan build.
Dari proyek pengujian Anda
Pastikan Anda memiliki referensi ke DLL runtime Fakes:
%ProgramFiles(x86)%\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\PublicAssemblies\Microsoft.QualityTools.Testing.Fakes.dll
Untuk setiap rakitan yang telah Anda buat Fakes-nya, tambahkan referensi ke file DLL yang sesuai di folder Fakes.Prebuild\FakesAssemblies proyek Anda.
Menghindari bentrokan nama rakitan
Di lingkungan Build Tim, semua output build digabungkan menjadi satu direktori. Jika beberapa proyek menggunakan Fakes, Fakes rakitan dari versi yang berbeda dapat saling menimpa. Misalnya, mscorlib.dll fakes TestProject1 dari .NET Framework 2.0 dan mscorlib.dll fakes TestProject2 untuk .NET Framework 4 akan menghasilkan rakitan Fakes mscorlib.Fakes.dll.
Agar masalah ini tidak terjadi, Fakes harus otomatis membuat nama rakitan Fakes yang memenuhi syarat versi untuk referensi non-proyek saat menambahkan file .fakes. Nama rakitan Fakes yang memenuhi syarat versi menyematkan nomor versi saat Anda membuat nama rakitan Fakes:
Mengingat rakitan MyAssembly dan versi 1.2.3.4, nama rakitan Fakes adalah MyAssembly.1.2.3.4.Fakes.
Anda dapat mengubah atau menghapus versi ini dengan mengedit atribut Versi elemen Rakitan di .fakes:
attribute of the Assembly element in the .fakes:
<Fakes ...>
<Assembly Name="MyAssembly" Version="1.2.3.4" />
...
</Fakes>
Konvensi penamaan Fakes
Konvensi penamaan jenis shim dan jenis stub
Namespaces
Akhiran .Fakes ditambahkan ke namespace layanan.
Misalnya, namespace layanan
System.Fakes
berisi jenis shim namespace layanan Sistem.Global.Fakes berisi jenis shim namespace layanan kosong.
Nama jenis
Awalan Shim ditambahkan ke nama jenis untuk membuat nama jenis shim.
Misalnya, ShimExample adalah jenis shim dari jenis Example.
Awalan stub ditambahkan ke nama jenis untuk membuat nama jenis stub.
Misalnya, StubIExample adalah jenis stub dari jenis IExample.
Struktur Jenis Berlapis dan Argumen Jenis
Argumen jenis generik disalin.
Struktur jenis berlapis disalin untuk jenis shim.
Konvensi penamaan bidang delegasi stub atau properti delegasi shim
Aturan dasar untuk penamaan bidang, dimulai dari nama kosong:
Nama metode ditambahkan.
Jika nama metode adalah penerapan antarmuka eksplisit, titik akan dihapus.
Jika metode bersifat generik,
Of
n akan ditambahkan dengan n adalah jumlah argumen metode generik.Nama metode khusus seperti pengambil dan pengatur properti diperlakukan seperti yang dijelaskan dalam tabel berikut:
Jika metode adalah... | Contoh | Nama metode ditambahkan |
---|---|---|
Konstruktor | .ctor |
Constructor |
Konstruktor statis | .cctor |
StaticConstructor |
Aksesor dengan nama metode yang terdiri dari dua bagian yang dipidahkan dengan "_" (seperti pengambil properti) | kind_name (kasus umum, tetapi tidak diberlakukan oleh ECMA) | NameKind, di mana kedua bagian telah dikapitalkan dan ditukar |
Pengambil properti Prop |
PropGet |
|
Pengatur properti Prop |
PropSet |
|
Penambah peristiwa | Add |
|
Penghapus peristiwa | Remove |
|
Operator terdiri dari dua bagian | op_name |
NameOp |
Misalnya: + operator | op_Add |
AddOp |
Untuk operator konversi, jenis pengembalian akan ditambahkan. | T op_Implicit |
ImplicitOpT |
Catatan
- Pengambil dan pengatur pengindeks akan diperlakukan mirip dengan properti. Nama default untuk pengindeks adalah
Item
. - Nama Jenis parameter diubah dan digabungkan.
- Jenis pengembalian diabaikan kecuali ada ambiguitas kelebihan beban. Jika ada ambiguitas kelebihan beban, jenis pengembalian ditambahkan di akhir nama.
Konvensi penamaan jenis parameter
Diberikan | String yang ditambahkan adalah... |
---|---|
JenisT |
T Namespace layanan, struktur berlapis, dan tics generik dihilangkan. |
Parameter keluarout T |
TOut |
Parameter refref T |
TRef |
Jenis arrayT[] |
TArray |
Jenis array multi-dimensiT[ , , ] |
T3 |
Jenis pointerT* |
TPtr |
Jenis generikT<R1, ...> |
TOfR1 |
Argumen jenis generik!i jenis C<TType> |
Ti |
Argumen metode generik!!i metode M<MMethod> |
Mi |
Jenis berlapisN.T |
N ditambahkan, lalu T |
Aturan berulang
Aturan berikut diterapkan secara berulang:
Karena Fakes menggunakan C# untuk membuat rakitan Fakes, setiap karakter yang akan menghasilkan token C# yang tidak valid dipisahkan ke "_" (garis bawah).
Jika nama yang dihasilkan berbenturan dengan anggota mana pun dari jenis deklarasi, skema penomoran akan digunakan dengan menambahkan penghitung dua digit, mulai dari 01.
Memanfaatkan Microsoft Fakes dalam Integrasi Berkelanjutan
Microsoft Fakes Assembly Generation
Microsoft Fakes adalah fitur yang tersedia secara eksklusif di Visual Studio Enterprise. Dengan demikian, pembuatan Fakes Assemblies memerlukan penggunaan Tugas Build Visual Studio saat membangun proyek Anda.
Catatan
Strategi alternatif melibatkan pemeriksaan Rakitan Palsu Anda langsung ke sistem Integrasi Berkelanjutan (CI) dan menggunakan Tugas MSBuild. Jika Anda memilih pendekatan ini, Anda perlu memastikan untuk menyertakan referensi perakitan ke rakitan Fakes yang dihasilkan dalam proyek pengujian Anda, seperti yang ditunjukkan dalam cuplikan kode berikut:
<Project Sdk="Microsoft.NET.Sdk">
<ItemGroup>
<Reference Include="FakesAssemblies\System.Fakes.dll"/>
</ItemGroup>
</Project>
Referensi ini harus ditambahkan secara manual, khusus untuk proyek gaya SDK (yaitu, .NET Core, .NET 5+, dan .NET Framework), karena proyek-proyek ini sekarang secara implisit menambahkan referensi perakitan. Jika Anda memutuskan untuk menggunakan metode ini, pastikan untuk memperbarui rakitan Palsu setiap kali rakitan induk mengalami perubahan.
Konten terkait
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk