Bagikan melalui


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.

  1. 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.

  2. Tambahkan referensi ke semua Sistem dan rakitan pihak ketiga yang Anda perlukan Fakes-nya.

  3. Tambahkan file .fakes untuk setiap rakitan dan build.

  4. 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, Ofn 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.