2014-04-09 19 views
6

Ben aşağıdaki satırı fileInfo Fileinfo bir örneğidir.Net Fakes - Temel sınıf soyut olduğunda miras alınan bir mülkün nasıl ayrılacağı?

var fileFullName = fileInfo.FullName; 

kapsayan bir birim test yazmak çalışıyorum.

FileInfo nesnesini kaydırmak için sahte kullanıyorum ancak, temel sınıftan miras alındığı için FullName özelliği için bir değer sağlayamıyorum.

kalıtsal değildir Adı özelliği için

, ben sadece bunu yapabilirsiniz: Microsoft tarafından sağlanan

ShimFileInfo.AllInstances.NameGet = info => OriginalFullName; 

cevabı bu durumda FileSystemInfo içinde, temel sınıf şim yaratmaktır. Ama bu denerseniz: FileSystemInfo oluşturulamaz soyut bir sınıftır ve bu nedenle shimmed edilemez çünkü

ShimFileSystemInfo.AllInstances.FullNameGet = info => OriginalFullName; 

O, çalışmıyor.

Bu özel durumda, etrafından dolaşabilirim çünkü bu dizini test edilebilir hale getirmek için DirectoryName ve Name özelliklerini birleştirebilirim, ancak çılgınca görünüyor çünkü istediğim özelliği kullanamıyorum çünkü tabanı.

Bu problemin karşısına kim çıkmış ve çözmeyi başardınız mı?

+0

Eh, ben yok Bu soruna rastlamak, ama Yansıma'yı kullanmaktan ne haber? –

+0

Neden sadece bir test dosyası oluşturmuyorsunuz? Bir test dosyası yapacağı zaman sahte kullanmak istediğiniz belirli bir neden var mı? – gfish3000

+0

Gerçekten test etmek istediğiniz şeyi düşünün, bir test dosyası kullanmıyorsanız, o zaman burada gerçekten test edilen nedir? Bir yöne gidiyormuş gibi görünüyorsun, test edeceğin tek şey senin sahte olduğunu. – Zache

cevap

5

Temel sınıfı kırpmanın işe yaramadığını söylemiştiniz, ama tam olarak bunu yapıyorum ve testlerimizde çalışıyor. System.dll, FileInfo : FileSystemInfo olarak tanımlanmış ve FileSystemInfo mscorlib içinde . mscorlib birçok türleri varsayılan olarak shimmed, ancak mscorlib.fakes bu eklerseniz dosya değildir:

<Fakes xmlns="http://schemas.microsoft.com/fakes/2011/"> 
    <Assembly Name="mscorlib" Version="4.0.0.0"/> 
    <ShimGeneration> 
    <Add FullName="System.IO.FileSystemInfo"/> 
    </ShimGeneration> 
</Fakes> 

ve sonra mscorlib gelen FileSystemInfo için ShimFileSystemInfo olsun test proje oluşturmak, hem de ShimFileInfo için System.dll dosyasından FileInfo. Sonra bu işleri:

using (ShimsContext.Create()) 
{ 
    var directoryName = "<testPath>"; 
    var fileName = "test.txt"; 
    ShimFileSystemInfo.AllInstances.FullNameGet = @this => "42"; 
    result = new DirectoryInfo(directoryName).GetFiles(fileName).First(); 
    Assert.AreEqual("42", result.FullName); // the fake fullname 
    Assert.AreEqual("test.txt", result.Name); // the real name 
} 

Uyarı: benim makinede (Visual Studio 2013, .NET 4.5.1) sahte dosya için

Referans çalışır: Code generation, compilation, and naming conventions in Microsoft Fakes

+0

mscorlib.fakes içindeki ekstra parça da burada hile yaptı. Ayrıca, kutudan üretilmeyen her şey için bir örnek teşkil eder, bu da mantıklıdır. – Dorival

İlgili konular