Aracılığıyla paylaş


Microsoft Fakes'te kod oluşturma, derleme ve adlandırma kuralları

Bu makalede Fakes kod oluşturma ve derlemedeki seçenekler ve sorunlar ele alınmaktadır ve Fakes tarafından oluşturulan türler, üyeler ve parametreler için adlandırma kuralları açıklanmaktadır.

Gereksinimler

  • Visual Studio Enterprise

  • .NET Framework projesi

  • Visual Studio 2019 Güncelleştirme 6'da ön izlemesi yapılan .NET Core, .NET 5.0 veya üzeri ve SDK stili proje desteği, Güncelleştirme 8'de varsayılan olarak etkindir. Daha fazla bilgi için bkz . .NET Core ve SDK stili projeler için Microsoft Fakes.

Kod oluşturma ve derleme

Saplamaların kod oluşturmayı yapılandırma

Saplama türlerinin oluşturulması, .fakes dosya uzantısına sahip bir XML dosyasında yapılandırılır. Fakes çerçevesi, özel MSBuild görevleri aracılığıyla derleme işlemiyle tümleşir ve derleme zamanında bu dosyaları algılar. Fakes kod oluşturucu saplama türlerini bir derlemede derler ve başvuruyu projeye ekler.

Aşağıdaki örnekte FileSystem.dll tanımlanan saplama türleri gösterilmektedir:

<Fakes xmlns="http://schemas.microsoft.com/fakes/2011/">
    <Assembly Name="FileSystem"/>
</Fakes>

Tür filtreleme

Hangi türlerin saplanması gerektiğini kısıtlamak için .fakes dosyasında filtreler ayarlanabilir. Seçili türlerin listesini oluşturmak için StubGeneration öğesinin altına sınırsız sayıda Clear, Add, Remove öğesi ekleyebilirsiniz.

Örneğin, aşağıdaki .fakes dosyası Sistem ve System.IO ad alanları altındaki türler için saplamalar oluşturur, ancak Sistem'de "Tanıtıcı" içeren herhangi bir türü dışlar:

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

Filtre dizeleri, eşleştirmenin nasıl yapılması gerektiğini tanımlamak için basit bir dil bilgisi kullanır:

  • Filtreler varsayılan olarak büyük/küçük harfe duyarlı değildir; filtreler bir alt dize eşleştirmesi gerçekleştirir:

    el "hello" ile eşleşir

  • Filtrenin sonuna eklemek ! , büyük/küçük harfe duyarlı hassas bir eşleşme olmasını sağlar:

    el! "hello" ile eşleşmiyor

    hello! "hello" ile eşleşir

  • Filtrenin sonuna eklemek * , dizenin ön eki ile eşleşmesini sağlar:

    el* "hello" ile eşleşmiyor

    he* "hello" ile eşleşir

  • Noktalı virgülle ayrılmış bir listedeki birden çok filtre, ayrıştırma olarak birleştirilir:

    el;wo "hello" ve "world" ile eşleşir

Saplama beton sınıfları ve sanal yöntemler

Varsayılan olarak, saplama türleri tüm korumalı olmayan sınıflar için oluşturulur. Saplama türlerini .fakes yapılandırma dosyası aracılığıyla sınıfları soyutlamayla kısıtlamak mümkündür:

<Fakes xmlns="http://schemas.microsoft.com/fakes/2011/">
  <Assembly Name="mscorlib" />
  <!-- user code -->
  <StubGeneration>
    <Types>
      <Clear />
      <Add AbstractClasses="true"/>
    </Types>
  </StubGeneration>
  <!-- /user code -->
</Fakes>

İç türler

Fakes kod oluşturucu oluşturulan Fakes derlemesi için görünür türler için dolgu türleri ve saplama türleri oluşturur. Çakışan derlemenin iç türlerini Fakes ve test derlemeniz için görünür hale getirmek için, oluşturulan Fakes derlemesine ve test derlemesine görünürlük sağlayan dolgulu derleme koduna öznitelikler ekleyin InternalsVisibleToAttribute . Bir örnek aşağıda verilmiştir:

// FileSystem\AssemblyInfo.cs
[assembly: InternalsVisibleTo("FileSystem.Fakes")]
[assembly: InternalsVisibleTo("FileSystem.Tests")]

Kesin adlandırılmış derlemelerdeki iç türler

Dolgulu derleme kesin olarak adlandırılmışsa ve derlemenin iç türlerine erişmek istiyorsanız:

  • Hem test derlemeniz hem de Fakes derlemesi kesin olarak adlandırılmalıdır.

  • Birleştirme derlemelerindeki InternalsVisibleToAttribute özniteliklerine test ve Fakes derlemesinin ortak anahtarlarını ekleyin. Dolgulanmış derleme tam olarak adlandırıldığında, dolgulanmış derleme kodundaki örnek özniteliklerin nasıl görüneceği aşağıda verilmiştir:

    // FileSystem\AssemblyInfo.cs
    [assembly: InternalsVisibleTo("FileSystem.Fakes",
        PublicKey=<Fakes_assembly_public_key>)]
    [assembly: InternalsVisibleTo("FileSystem.Tests",
        PublicKey=<Test_assembly_public_key>)]
    

Dolgulu derleme kesin olarak adlandırılmışsa, Fakes çerçevesi oluşturulan Fakes derlemesini otomatik olarak güçlü bir şekilde imzalar. Test derlemesini güçlü bir şekilde imzalamanız gerekir. Bkz. Tanımlayıcı Adlandırılmış derlemeler.

Fakes çerçevesi, oluşturulan tüm derlemeleri imzalamak için aynı anahtarı kullanır, böylece bu kod parçacığını bir başlangıç noktası olarak kullanarak sahte derlemenin InternalsVisibleTo özniteliğini dolgulu derleme kodunuza ekleyebilirsiniz.

[assembly: InternalsVisibleTo("FileSystem.Fakes, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e92decb949446f688ab9f6973436c535bf50acd1fd580495aae3f875aa4e4f663ca77908c63b7f0996977cb98fcfdb35e05aa2c842002703cad835473caac5ef14107e3a7fae01120a96558785f48319f66daabc862872b2c53f5ac11fa335c0165e202b4c011334c7bc8f4c4e570cf255190f4e3e2cbc9137ca57cb687947bc")]

.fakes dosyasının öğesinde öznitelik değeriCompilation Fakes\olarak KeyFile alternatif anahtarı içeren .snk dosyasının tam yolunu belirterek Fakes derlemesi için farklı bir ortak anahtar belirtebilirsiniz. Örneğin:

<-- FileSystem.Fakes.fakes -->
<Fakes ...>
  <Compilation KeyFile="full_path_to_the_alternate_snk_file" />
</Fakes>

Ardından alternatif .snk dosyasının ortak anahtarını, dolgulu derleme kodundaki Fakes derlemesi için InternalVisibleTo özniteliğinin ikinci parametresi olarak kullanmanız gerekir:

// FileSystem\AssemblyInfo.cs
[assembly: InternalsVisibleTo("FileSystem.Fakes",
    PublicKey=<Alternate_public_key>)]
[assembly: InternalsVisibleTo("FileSystem.Tests",
    PublicKey=<Test_assembly_public_key>)]

Yukarıdaki örnekte, ve Test_assembly_public_key değerleri Alternate_public_key aynı olabilir.

Derleme sürelerini iyileştirme

Fakes derlemelerinin derlenmesi, derleme sürenizi önemli ölçüde artırabilir. Ayrı bir merkezi projede .NET Sistem derlemeleri ve üçüncü taraf derlemeler için Fakes derlemeleri oluşturarak derleme süresini en aza indirebilirsiniz. Bu tür derlemeler makinenizde nadiren değiştiğinden, oluşturulan Fakes derlemelerini diğer projelerde yeniden kullanabilirsiniz.

Birim testi projelerinizden, proje klasöründeki FakesAssemblies altına yerleştirilen derlenmiş Fakes derlemelerine bir başvuru ekleyin.

  1. Test projelerinizle eşleşen .NET çalışma zamanı sürümüyle yeni bir Sınıf Kitaplığı oluşturun. Buna Fakes.Prebuild diyelim. class1.cs dosyasını projeden kaldırın, gerekli değildir.

  2. Fakes'a ihtiyacınız olan tüm Sistem ve üçüncü taraf derlemelerine başvuru ekleyin.

  3. Derlemelerin ve derlemelerin her biri için bir .fakes dosyası ekleyin.

  4. Test projenizden

    • Fakes çalışma zamanı DLL'sine bir başvurunuz olduğundan emin olun:

      %ProgramFiles(x86)%\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\PublicAssemblies\Microsoft.QualityTools.Testing.Fakes.dll

    • Fakes'ı oluşturduğunuz her derleme için, projenizin Fakes.Prebuild\FakesAssemblies klasörüne karşılık gelen DLL dosyasına bir başvuru ekleyin.

Derleme adı çakışmasını önleme

Ekip Derleme ortamında tüm derleme çıkışları tek bir dizinde birleştirilir. Birden çok proje Fakes kullanıyorsa, farklı sürümlerden Fakes derlemelerinin birbirini geçersiz kıldığını fark edebilir. Örneğin, TestProject1 .NET Framework 2.0'dan mscorlib.dll sahtedir ve TestProject2.NET Framework 4 için mscorlib.dll sahtedir ve her ikisi de bir mscorlib'e neden olur. Fakes.dll Fakes derlemesi.

Bu sorundan kaçınmak için Fakes, .fakes dosyalarını eklerken proje dışı başvurular için sürüm nitelikli Fakes derleme adlarını otomatik olarak oluşturmalıdır. Fakes derleme adını oluşturduğunuzda sürüm nitelikli Fakes derleme adı bir sürüm numarası ekler:

MyAssembly derlemesi ve 1.2.3.4 sürümü verildiğinde Fakes derleme adı MyAssembly.1.2.3.4.Fakes'tır.

.fakes içindeki Assembly öğesinin Version özniteliğini düzenleyerek bu sürümü değiştirebilir veya kaldırabilirsiniz:

attribute of the Assembly element in the .fakes:
<Fakes ...>
  <Assembly Name="MyAssembly" Version="1.2.3.4" />
  ...
</Fakes>

Fakes adlandırma kuralları

Dolgu türü ve saplama türü adlandırma kuralları

Ad Alanları

  • . Fakes soneki ad alanına eklenir.

    Örneğin, System.Fakes ad alanı Sistem ad alanı dolgu türlerini içerir.

  • Global.Fakes boş ad alanının dolgu türünü içerir.

    Tür adları

  • Dolgu türü adını oluşturmak için tür adına dolgu ön eki eklenir.

    Örneğin, ShimExample Örnek türünün dolgu türüdür.

  • Saplama ön eki, saplama türü adını oluşturmak için tür adına eklenir.

    Örneğin StubIExample, IExample türünün saplama türüdür.

    Tür Bağımsız Değişkenleri ve İç İçe Yerleştirilmiş Tür Yapıları

  • Genel tür bağımsız değişkenleri kopyalanır.

  • Dolgu türleri için iç içe tür yapısı kopyalanır.

Dolgu temsilcisi özelliği veya saplama temsilcisi alan adlandırma kuralları

Boş bir addan başlayarak alan adlandırma için temel kurallar :

  • Yöntem adı eklenir.

  • Yöntem adı açık bir arabirim uygulamasıysa, noktalar kaldırılır.

  • Yöntem genelse, Ofn eklenir; burada n , genel yöntem bağımsız değişkenlerinin sayısıdır.

    Özellik alıcısı veya ayarlayıcıları gibi özel yöntem adları aşağıdaki tabloda açıklandığı gibi ele alınır:

Yöntem... Örnek Yöntem adı eklenmiştir
Oluşturucu .ctor Constructor
Statik oluşturucu .cctor StaticConstructor
"_" ile ayrılmış iki bölümden oluşan yöntem adına sahip bir erişimci (özellik alıcıları gibi) kind_name (yaygın durum, ancak ECMA tarafından zorlanmaz) NameKind, her iki parçanın da büyük harfle yazıldığı ve değiştirildiği yer
Özelliğin alıcısı Prop PropGet
Özelliğin ayarlayıcısı Prop PropSet
Olay ekleyicisi Add
Olay kaldırıcı Remove
İki bölümden oluşan bir işleç op_name NameOp
Örneğin: + işleci op_Add AddOp
Dönüştürme işleci için dönüş türü eklenir. T op_Implicit ImplicitOpT

Not

  • Dizin oluşturucuların alıcıları ve ayarlayıcıları özelliğine benzer şekilde değerlendirilir. Dizin oluşturucunun varsayılan adıdır Item.
  • Parametre türü adları dönüştürülür ve birleştirilir.
  • Aşırı yükleme belirsizliği olmadığı sürece dönüş türü yoksayılır. Aşırı yükleme belirsizliği varsa, dönüş türü adın sonuna eklenir.

Parametre türü adlandırma kuralları

Verilen Eklenen dize...
Bir türT T

Ad alanı, iç içe yapı ve genel tikler bırakılır.
Out parametresiout T TOut
Ref parametresi ref T TRef
Dizi türüT[] TArray
Çok boyutlu dizi türü T[ , , ] T3
İşaretçi türüT* TPtr
Genel bir türT<R1, ...> TOfR1
Türünde genel bir tür bağımsız değişkeni!iC<TType> Ti
Yöntemin genel yöntem bağımsız değişkeni!!iM<MMethod> Mi
İç içe bir türN.T N eklenir ve ardından T

Özyinelemeli kurallar

Aşağıdaki kurallar özyinelemeli olarak uygulanır:

  • Fakes, Fakes derlemelerini oluşturmak için C# kullandığından, geçersiz bir C# belirteci üretecek tüm karakterler "_" (alt çizgi) olarak kaçış yapar.

  • Sonuçta elde edilen ad bildirim türünün herhangi bir üyesiyle çakıştırılırsa, 01'den başlayarak iki basamaklı bir sayaç eklenerek numaralandırma düzeni kullanılır.

Sürekli Tümleştirmede Microsoft Fakes'i Kullanma

Microsoft Fakes Derleme Oluşturma

Microsoft Fakes, yalnızca Visual Studio Enterprise'da kullanılabilen bir özelliktir. Bu nedenle Fakes Assemblies oluşturma işlemi, projenizi oluştururken Visual Studio Derleme Görevinin kullanılmasını zorunlu kılmaktadır.

Not

Alternatif bir strateji, Fakes Assemblies'inizi doğrudan Sürekli Tümleştirme (CI) sistemine denetlemeyi ve MSBuild Görevini kullanmayı içerir. Bu yaklaşımı tercih ederseniz, aşağıdaki kod parçacığında gösterildiği gibi test projenizde oluşturulan Fakes derlemesine bir derleme başvurusu eklediğinizden emin olmanız gerekir:

<Project Sdk="Microsoft.NET.Sdk">
    <ItemGroup>
        <Reference Include="FakesAssemblies\System.Fakes.dll"/>
    </ItemGroup>
</Project>

Bu projeler artık örtük olarak derleme başvuruları eklediğinden, bu başvuru özellikle SDK stili projeler (.NET Core, .NET 5+ ve .NET Framework) için el ile eklenmelidir. Bu yöntemi kullanmaya karar verirseniz, üst derleme değişikliklere uğradığında Fakes derlemesini güncelleştirdiğinizden emin olun.