Aracılığıyla paylaş


Birim testi için uygulamanızı diğer derlemelerden yalıtmak üzere dolgular kullanma

Dolgu türü bildirmek için Microsoft Fakes Framework kullanan iki teknoloji test ortamından kolayca yalıtım bileşenleri biridir.Dolgu verileri belirli yöntemleri test parçası olarak yazdığınız koda çağrı yönlendir.Birçok yöntem dış koşullara bağlı farklı sonuçlar döndürebilir, ancak bir dolgu test denetimi altındadır ve her çağrısında tutarlı sonuçlar döndürebilir.Bu testleri yazmak çok daha kolay hale getirir.

Dolgu verileri çözümünüzün bir parçası olmayan derlemeler kodunuzdan ayırmak için kullanın.Bileşenleri çözümünüze birbirinden ayırmak için yer tutucular kullanmanızı öneririz.

Genel bakış ve Hızlı Başlangıç Kılavuzu için bkz:Microsoft Fakes ile Test Edilen Kodu Yalıtma

Gereksinimler

  • Visual Studio Ultimate

Bkz: Video (1 h 16): sınama Un-testable kod, Visual Studio 2012 Fakes ile

Bu konuda

İşte bu konuda bilgi edineceksiniz:

Örnek: y2k hata

Dolgu verileri nasıl kullanılır?

  • Fakes derlemeler Ekle

  • ShimsContext kullanma

  • Testler ile dolgu verileri yazma

Dolgu verileri için çeşitli yöntemler

Varsayılan davranışı değiştirme

Ortam Algılama erişir

Eşzamanlılık

Dolgu yönteminden özgün yöntemini çağırarak

Sınırlamalar

Örnek: y2k hata

1 Ocak 2000'in üzerinde bir istisna atar bir yöntem bakalım göz önünde bulundurun:

// code under test
public static class Y2KChecker {
    public static void Check() {
        if (DateTime.Now == new DateTime(2000, 1, 1))
            throw new ApplicationException("y2kbug!");
    }
}

Bu yöntemi sınama özellikle sorunlu program bağlıdır çünkü DateTime.Now, bilgisayara bağlı bir yöntem kullanıcının saat, bir ortama bağımlı, kararlı olmayan bir yöntem.Ayrıca, DateTime.Now statik bir özellik olduğundan, burada bir saplama türü kullanılamaz.Bu sorun, birim testi yalıtım sorunu özgüven: doğrudan veritabanına API çağrısı, web hizmetleriyle iletişim kurmak ve benzeri programlar kendi mantığı ortamınıza bağlıdır çünkü sabit birim testi.

Bu, burada dolgu türleri kullanılmalıdır.Dolgu türü kullanıcı tanımlı bir temsilci için herhangi bir .NET yöntemi detour için bir mekanizma sağlar.Fakes oluşturucusu tarafından kod tarafından üretilen dolgu türleridir ve biz dolgu türleri çağrısı, temsilciler, yeni yöntem uygulamalarını belirtmek için kullandıkları.

Aşağıdaki sınama Dolgu türü kullanmak nasıl gösterir ShimDateTime, DateTime.Now özel bir uygulamasını sağlamak için:

//unit test code
// create a ShimsContext cleans up shims 
using (ShimsContext.Create()
    // hook delegate to the shim method to redirect DateTime.Now
    // to return January 1st of 2000
    ShimDateTime.NowGet = () => new DateTime(2000, 1, 1);
    Y2KChecker.Check();
}

Dolgu verileri nasıl kullanılır?

Hh549176.collapse_all(tr-tr,VS.110).gifFakes derlemeler Ekle

  1. Birim test projenizin Solution Explorer'da genişletin başvuruları.

    • Visual Basic'te çalışırken, seçmelisiniz Tüm dosyaları göster başvurular listesini görmek için Çözüm Gezgini araç çubuğunda.
  2. Dolgu verileri oluşturmak istediğiniz sınıf tanımlarını içeren bütünleştirilmiş kodunu seçin.DateTime dolgu istiyorsanız, örneğin, System.dll seçin

  3. Kısayol menüsünde Fakes derleme Ekle.

Hh549176.collapse_all(tr-tr,VS.110).gifShimsContext kullanma

Dolgu türü birim test çerçevesinde kullanırken, test kodu almanız gerekir bir ShimsContext yaşam süresi, dolgu verileri denetlemek için.Biz bu olmadı gerektiriyorsa, AppDomain kapanmasına kadar dolgu verileri son.Oluşturmanın en kolay yolu bir ShimsContext statik kullanarak Create() yöntemi aşağıdaki kodda gösterildiği gibi:

//unit test code
[Test]
public void Y2kCheckerTest() {
  using(ShimsContext.Create()) {
    ...
  } // clear all shims
}

Her dolgu içerik doğru şekilde elden çıkarmak önemlidir.Bir kural okuyucularınızın, her zaman Ara ShimsContext.Create içinde bir using uygun temizleme, kayıtlı dolgu verileri sağlamak için deyimi.Örneğin, yerini alan bir test yöntemi için bir dolgu kayıt DateTime.Now yöntemi her zaman döndüren bir temsilci ile ilk, Ocak 2000.Test yöntemi kayıtlı dolgusunda temizlemek unutursanız, test çalışması geri kalanı her zaman döndürür ilk, Ocak 2000 DateTime.Now olarak değer.Bu suprising ve kafa olabilir.

Hh549176.collapse_all(tr-tr,VS.110).gifBir test ile dolgu verileri yazma

Test kodunuzu eklemek bir detour sahte istediğiniz yöntemi.Örne?in:

[TestClass]
public class TestClass1
{ 
        [TestMethod]
        public void TestCurrentYear()
        {
            int fixedYear = 2000;

            using (ShimsContext.Create())
            {
              // Arrange:
                // Detour DateTime.Now to return a fixed date:
                System.Fakes.ShimDateTime.NowGet = 
                () =>
                { return new DateTime(fixedYear, 1, 1); };

                // Instantiate the component under test:
                var componentUnderTest = new MyComponent();

              // Act:
                int year = componentUnderTest.GetTheCurrentYear();

              // Assert: 
                // This will always be true if the component is working:
                Assert.AreEqual(fixedYear, year);
            }
        }
}
<TestClass()> _
Public Class TestClass1
    <TestMethod()> _
    Public Sub TestCurrentYear()
        Using s = Microsoft.QualityTools.Testing.Fakes.ShimsContext.Create()
            Dim fixedYear As Integer = 2000
            ' Arrange:
            ' Detour DateTime.Now to return a fixed date:
            System.Fakes.ShimDateTime.NowGet = _
                Function() As DateTime
                    Return New DateTime(fixedYear, 1, 1)
                End Function

            ' Instantiate the component under test:
            Dim componentUnderTest = New MyComponent()
            ' Act:
            Dim year As Integer = componentUnderTest.GetTheCurrentYear
            ' Assert: 
            ' This will always be true if the component is working:
            Assert.AreEqual(fixedYear, year)
        End Using
    End Sub
End Class

Dolgu sınıf adları yapılmış ekleyerek Fakes.Shim için özgün adını yazın.

İş ekleyerek shims detours test altındaki uygulama kodu içinde.Özgün yöntemine bir çağrı oluşur her yerde gerçek yöntemi çağırmak yerine, dolgu kodunuzu çağırılmamasını sağlayacak biçimde bir detour Fakes sistem yapar.

Detours oluşturulan ve çalışma zamanında silinmiş dikkat edin.Her zaman bir detour ömrü içinde oluşturmalısınız bir ShimsContext.Onu elden çıkarıldığında, etkin olduğu sırada oluşturduğunuz herhangi bir dolgu verileri kaldırılır.Bunu yapmanın en iyi yolu içinde olan bir using ifadesi.

Fakes ad alanı bulunmadığını belirten bir yapı hata görebilirsiniz.Bu hata, bazen başka bir derleme hatası olduğunda görüntülenir.Diğer hataları giderin ve vanish.

Dolgu verileri için çeşitli yöntemler

Dolgu türü statik yöntemler veya kendi temsilcileri ile sanal olmayan yöntemler de dahil olmak üzere herhangi bir .NET yöntemini değiştirmek olanak sağlar.

Hh549176.collapse_all(tr-tr,VS.110).gifStatik yöntemler

Statik yöntemler için Dolgu verisi eklemek için Özellikler dolgu tipinde yerleştirilir.Her özelliğin, yalnızca hedef yönteme bir temsilci eklemek için kullanılan bir ayarlayıcı vardır.Örneğin, bir sınıf verildiğinde MyClass ile bir static yöntem MyMethod:

//code under test
public static class MyClass {
    public static int MyMethod() {
        ...
    }
}

Bizim için bir Dolgu eklemek MyMethod , her zaman 5 döndürür:

// unit test code
ShimMyClass.MyMethod = () =>5;

Hh549176.collapse_all(tr-tr,VS.110).gif(Tüm örnekler için) örnek yöntemleri

Benzer şekilde, statik yöntem örnek yöntemleri tüm örnekler için denetlemezdi.Bu dolgu verisi eklemek için Özellikler karışıklığı önlemek için de AllInstances adlı bir iç içe türü yerleştirilir.Örneğin, bir sınıf verildiğinde MyClass bir örnek yöntemi ile MyMethod:

// code under test
public class MyClass {
    public int MyMethod() {
        ...
    }
}

İçin bir dolgu ekleyebilirsiniz MyMethod 5, örneğin ne olursa olsun, her zaman döndürür:

// unit test code
ShimMyClass.AllInstances.MyMethod = () => 5;

ShimMyClass oluşturulan tür yapısı kodu aşağıdaki gibi görünür:

// Fakes generated code
public class ShimMyClass : ShimBase<MyClass> {
    public static class AllInstances {
        public static Func<MyClass, int>MyMethod {
            set {
                ...
            }
        }
    }
}

Fakes dikkat edin, çalışma zamanı örneğinin bu durumda temsilci ilk bağımsız değişken olarak geçirir.

Hh549176.collapse_all(tr-tr,VS.110).gifÖrnek yöntemleri (örneğin bir çalışma zamanı)

Örnek yöntemleri çağrı alıcı ile bağlı farklı temsilcileri tarafından da denetlemezdi.Bu türün örneği başına farklı davranışlar aynı örnek yöntemi sağlar.Bu dolgu verileri için Dolgu türü örnek yöntemleri özelliklerdir.Her örneklenmiş Dolgu türü shimmed türü ham bir örneği ile ilişkili.

Örneğin, bir sınıf verildiğinde MyClass bir örnek yöntemi ile MyMethod:

// code under test
public class MyClass {
    public int MyMethod() {
        ...
    }
}

İlk 5 her zaman verir ve 10 saniye her zaman verir, biz MyMethod iki Dolgu türü ayarlayabilirsiniz:

// unit test code
var myClass1 = new ShimMyClass()
{
    MyMethod = () => 5
};
var myClass2 = new ShimMyClass { MyMethod = () => 10 };

ShimMyClass oluşturulan tür yapısı kodu aşağıdaki gibi görünür:

// Fakes generated code
public class ShimMyClass : ShimBase<MyClass> {
    public Func<int> MyMethod {
        set {
            ...
        }
    }
    public MyClass Instance {
        get {
            ...
        }
    }
}

Gerçek shimmed türü örneği örnek özelliği erişilebilir:

// unit test code
var shim = new ShimMyClass();
var instance = shim.Instance;

Genellikle sadece Dolgu türü olarak kullanabilmeniz için Dolgu türü, shimmed türüne örtülü bir dönüştürme de vardır:

// unit test code
var shim = new ShimMyClass();
MyClass instance = shim; // implicit cast retrieves the runtime
                         // instance

Hh549176.collapse_all(tr-tr,VS.110).gifOluşturucular

Kurucular gelecekteki nesnelere Dolgu türü eklemek için de denetlemezdi.Her kurucu Dolgu türü statik bir yöntem yapıcı olarak sunulur.Örneğin, bir sınıf verildiğinde MyClass bir tamsayı ayırdığınız bir oluşturucu ile:

// code under test
public class MyClass {
    public MyClass(int value) {
        this.Value = value;
    }
    ...
}

Değer işareti çağrıldığında kurucu değeri ne olursa olsun -5 gelecekteki her örneği verir böylece biz yapıcısının dolgu tipi ayarlayın:

// unit test code
ShimMyClass.ConstructorInt32 = (@this, value) => {
    var shim = new ShimMyClass(@this) {
        ValueGet = () => -5
    };
};

Not her Dolgu türü iki kurucusu ortaya koyar.Varsayılan oluşturucu bağımsız değişkeni yalnızca yapıcı Dolgu verisi içinde kullanılmalıdır gibi bir shimmed örneği alma yapıcısı çalışırken yeni bir örneği gereklidir kullanılmalıdır:

// unit test code
public ShimMyClass() { }
public ShimMyClass(MyClass instance) : base(instance) { }

Followoing kod ShimMyClass oluşturulan tür yapısına benzer:

// Fakes generated code
public class ShimMyClass : ShimBase<MyClass>
{
    public static Action<MyClass, int> ConstructorInt32 {
        set {
            ...
        }
    }

    public ShimMyClass() { }
    public ShimMyClass(MyClass instance) : base(instance) { }
    ...
}

Hh549176.collapse_all(tr-tr,VS.110).gifTemel üyeler

Dolgu özellikleri temel üyelerinin temel türü için bir dolgu oluşturma ve alt örneği dolgu taban sınıfının yapıcısı için bir parametre olarak geçirerek tarafından erişilebilir.

Örneğin, bir sınıf verildiğinde MyBase bir örnek yöntemi ile MyMethod ve bir alt MyChild:

public abstract class MyBase {
    public int MyMethod() {
        ...
    }
}

public class MyChild : MyBase {
}

Biz Dolgu verisi ayarlamak MyBase oluşturarak yeni bir ShimMyBase dolgu:

// unit test code
var child = new ShimMyChild();
new ShimMyBase(child) { MyMethod = () => 5 };

Not alt Dolgu türü temel dolgu Yapıcıya parametre olarak iletilen alt örneği için örtülü olarak dönüştürülür.

Aşağıdaki kod ShimMyChild ve ShimMyBase oluşturulan tür yapısına benzer:

// Fakes generated code
public class ShimMyChild : ShimBase<MyChild> {
    public ShimMyChild() { }
    public ShimMyChild(Child child)
        : base(child) { }
}
public class ShimMyBase : ShimBase<MyBase> {
    public ShimMyBase(Base target) { }
    public Func<int> MyMethod
    { set { ... } }
}

Hh549176.collapse_all(tr-tr,VS.110).gifStatik oluşturucular

Dolgu türü statik bir yöntem ortaya StaticConstructor Dolgu türü statik oluşturucu için.Herhangi bir üye türü erişmeden önce aşağıdakilerden emin olmak gereken yalnızca bir kez statik oluşturucular çalıştırıldığından dolgu yapılandırılır.

Hh549176.collapse_all(tr-tr,VS.110).gifSonlandırıcılar

Sonlandırıcılar Fakes içinde desteklenmez.

Hh549176.collapse_all(tr-tr,VS.110).gifPrivate yöntemleri

İmza, yalnızca görünür türleri olan private yöntemleri için dolgu özellikleri Fakes kod üreticisi oluşturacak ben.e. parametre türleri ve dönüş türü görünür.

Hh549176.collapse_all(tr-tr,VS.110).gifBağlama arabirimleri

Shimmed türü bir arabirim geliştirdiğinde arabirimden bir kerede tüm üyelerine bağlamak izin veren bir yöntem kod üreticisi yayar.

Örneğin, bir sınıf verildiğinde MyClass uygulayan IEnumerable<int>:

public class MyClass : IEnumerable<int> {
    public IEnumerator<int> GetEnumerator() {
        ...
    }
    ...
}

Biz uygulamaları dolgu IEnumerable<int> Bind yöntemini çağırarak MyClass içinde:

// unit test code
var shimMyClass = new ShimMyClass();
shimMyClass.Bind(new List<int> { 1, 2, 3 });

Aşağıdaki kod ShimMyClass oluşturulan tür yapısına benzer:

// Fakes generated code
public class ShimMyClass : ShimBase<MyClass> {
    public ShimMyClass Bind(IEnumerable<int> target) {
        ...
    }
}

Varsayılan davranışı değiştirme

Her üretilen Dolgu türü örneği tutan IShimBehavior arabirim aracılığıyla ShimBase<T>.InstanceBehavior özelliği.Bir istemci değil açıkça denetlemezdi bir örnek üye çağırırsa davranışı kullanılır.

Davranışı açıkça ayarlanmış değil, statik tarafından döndürülen örnek kullanır ShimsBehaviors.Current özelliği.Varsayılan olarak bu özellik, NotImplementedException özel durumunu atan bir davranış döndürür.

Bu davranış ayarlayarak herhangi bir zamanda değiştirilebilir InstanceBehavior özelliği herhangi bir dolgu örneği.Örneğin, aşağıdaki kod parçası, dönüş türü varsayılan değerini döndürür veya hiçbir şey yapmaz bir davranış dolgu değiştirir — yani, default(T):

// unit test code
var shim = new ShimMyClass();
//return default(T) or do nothing
shim.InstanceBehavior = ShimsBehaviors.DefaultValue;

Davranışı da genel olarak shimmed tüm örnekler için değiştirilebilir InstanceBehavior özelliği açık olarak ayarlanmamış statik ayarlayarak ShimsBehaviors.Current özelliği:

// unit test code
// change default shim for all shim instances
// where the behavior has not been set
ShimsBehaviors.Current = 
    ShimsBehaviors.DefaultValue;

Ortam Algılama erişir

Belirli bir türdeki atayarak statik yöntemler de dahil olmak üzere tüm üyelerine bir davranış eklemek mümkündür ShimsBehaviors.NotImplemented statik özelliğe davranış Behavior karşılık gelen Dolgu türü:

// unit test code
// assigning the not implemented behavior
ShimMyClass.Behavior = ShimsBehaviors.NotImplemented;
// shorthand
ShimMyClass.BehaveAsNotImplemented();

Eşzamanlılık

Dolgu verisi türleri AppDomain içinde tüm iş parçacıklarını uygulanır ve iş parçacığının benzeşimi yoktur.Eşzamanlılık destekleyen bir test Çalıştırıcısı kullanmayı planlıyorsanız, bu, önemli bir olgu: Dolgu türü kapsayan testleri aynı anda çalıştırılamaz.Bu özellik Fakes çalışma zamanı tarafından enfored değil.

Dolgu yönteminden özgün yöntemini çağırarak

Biz aslında dosya adı doğrulanırken yönteme geçirilen sonra metni dosya sistemine yazmak istediğinizi düşünelim.Bu durumda, biz dolgu yöntemi ortasında özgün yöntemini çağırmak istersiniz.

Bir temsilci kullanarak özgün yöntemine bir çağrı kaydırmak için bu sorunu çözmek için ilk yaklaşım olan ve ShimsContext.ExecuteWithoutShims() aşağıdaki kodda olduğu gibi:

// unit test code
ShimFile.WriteAllTextStringString = (fileName, content) => {
  ShimsContext.ExecuteWithoutShims(() => {

      Console.WriteLine("enter");
      File.WriteAllText(fileName, content);
      Console.WriteLine("leave");
  });
};

Başka bir yaklaşım, null, özgün yöntemini çağırın ve dolgu geri dolgu ayarlamaktır.

// unit test code
ShimsDelegates.Action<string, string> shim = null;
shim = (fileName, content) => {
  try {
    Console.WriteLine("enter”);
    // remove shim in order to call original method
    ShimFile.WriteAllTextStringString = null;
    File.WriteAllText(fileName, content);
  }
  finally
  {
    // restore shim
    ShimFile.WriteAllTextStringString = shim;
    Console.WriteLine("leave");
  }
};
// initialize the shim
ShimFile.WriteAllTextStringString = shim;

Sınırlamalar

Dolgu verileri .NET temel sınıf kitaplığındaki tüm türlerinde kullanılamaz mscorlib ve Sistem.

Dış kaynaklar

Hh549176.collapse_all(tr-tr,VS.110).gifKılavuz

Visual Studio 2012 – bölüm 2 ile sürekli teslimat için sınama: birim testi: iç sınama

Ayrıca bkz.

Kavramlar

Microsoft Fakes ile Test Edilen Kodu Yalıtma

Diğer Kaynaklar

Peter Provost'ın blog: Visual Studio 2012 dolgu verileri

Video (1 h 16): sınama Un-testable kod, Visual Studio 2012 Fakes ile