2016-03-31 20 views
2

Başka bir yöntemde çağrılan bir yöntemle alay etmeye çalışmak.Test için bir yöntem alay a

public virtual bool hello(string name, int age) 
{ 

    string lastName = GetLastName(); 
} 

public virtual string GetLastName() 
    { 
     return "xxx"; 
    } 

Mock<program> name= new Mock<program>(); 
name.Setup(x => x.GetLastName()).Returns("qqq"); 

GetLastName yönteminin her zaman "qqq" değerini döndürmesini istiyorum.

+0

Hangi sorunu denediniz? Bu doğru görünüyor – Kritner

+0

Kesme noktası koyduğumda, soyadımın adı = xxx değeri. – codeislife

cevap

1

Bu, o tam yöntem uygulaması şunlardır varsayarak çalışması gerekir

public class MyProgram 
{ 

    public bool hello(string name, int age) 
    { 
     string lastName = GetLastName(); 

     return string.Format("hello {0}", lastName); 
    } 

    public virtual string GetLastName() 
    { 
     return "xxx"; 
    } 
} 

public class MyProgramTests 
{ 

    [TestMethod] 
    public void MyTest() 
    { 

     string stringToReturn = "qqq"; 
     Mock<MyProgram> name = new Mock<MyProgram>(); 
     name.CallBase = true; 
     name.Setup(x => x.GetLastName()).Returns(stringToReturn); 

     var results = name.Object.hello(It.IsAny<string>(), It.IsAny<int>()); 

     string expected = string.Format("hello {0}", results); 

     Assert.AreEqual(expected, results); 
    } 
} 

Ben hala oldukça Yorumlarınız takip etmiyorum:

parametre gerçekten ne yapmalıdır Mock ne anlama geliyor ?? olabilir mi? Özür dilerim, sözdizimini tam olarak anlamıyorum. Açıklığa kavuşturmak için, sahte, kodlarıma kırılma noktaları koyduğumda, kesme noktalarının ben alay ettiğim yöntemleri atlaması gerektiği anlamına gelir. Ben haklı mıyım Ayrıca sınıf var oldukça çok şey anlamına gelen genel bir gösterge olma T -

Mock<T>

Eğer T bir tür alay sağlar. Geleneksel olarak, gerçek bir class değil, bir interface alaycı olurdu, ancak yukarıdaki örnekte bir sınıf alay ediyoruz. Test edilen örnek birim testi için, birim testinin amacı hello(string, int)'un uygulanmasını test etmektir. hello(string, int)'un, GetLastName() adı verilen bu sınıftaki başka bir yönteme dayandığını biliyoruz. GetLastName() un uygulanması önemli olsa da, hello(string, int) birim testinin kapsamı için önemli değildir. Bu nedenle, bağımlılığın uygulaması konusunda endişelenmeden, hello(string, int)'un işlevselliğini test etmek için aramayı ve geri dönüşünü dalgalandırıyoruz.

Umarım biz sınıf MyProgram alay ve cevap GetLastName()

Teşekkür (sahte) Yeni bir uygulama sağlıyorsanız o daha belirgin hale getirmek için gerçek sınıf adları ile yukarıda kuşattı. Başka bir yöntemi arayan başka bir yöntemi arayan bir yöntemi test etmek istersem ne olur? Örneğin için. metot merhaba başka bir yöntem mi çağırdı? Eğer birim testleri inşa ederken

aynı ilke geçerlidir (onlar ünite testler değil, entegrasyon testleri veya diğer, her zaman bir açık teste konsantre olmak istiyorum varsayarak biz test birimi Bar() iseniz yöntemi. What's the difference between unit and integration tests?

public class Foo 
{ 

    public string Bar() 
    { 
     return string.Format("{0}Bar", Baz(5));; 
    } 

    public virtual string Baz(int someNumber) 
    { 
     return string.Format("{0}Baz", DoStuff(someNumber).ToString()); 
    } 

    public virtual int DoStuff(int someNumber) 
    { 
     return someNumber+1; 
    } 

} 

biz Baz(int) uygulanması veyadaha kötüsü umurumda değil. Not biz uygulama uygulamasının değer vermediğine dikkat etmiyoruz. Bar() s perspektifinden, önemli olan tek şey Baz(int) bir dize döndürmesidir. Hangi dize? Bar() s birim testi için önemli değildir.

Numune Bar() test: Biz Baz(int) gerçek uygulama göz ardı edilmektedir yukarıdaki içinde

[TestMethod] 
public void Bar_ReturnsBazValueWithBarAppended 
{ 
    // Arrange 
    string testBazReturn = "test"; 
    Mock<Foo> mock = new Mock<Foo>(); 
    mock.CallBase = true; 
    mock 
     .Setup(s => s.Baz(It.IsAny<int>()) 
     .Returns(testBazReturn); 

    // Act 
    var results = mock.Object.Bar(); 

    // Assert 
    Assert.AreEqual(string.Format("{0}{1}", testBazReturn, "Bar"), results); 
    mock.Verify(v => v.Baz(It.IsAny<int>())); // Verifies that Baz was called 
} 

Bildirim, Baz(int) bizim gerçek uygulamaları ve DoStuff(int), fark etmez, ve DoStuff(int) bile gelmiyor oyuna. Biz Baz(int) test etmek olsaydı

Şimdi, sadece aynı zihniyeti izleyin: şimdi biz test birimi Baz(int) olduğumuza göre, yukarıdaki olarak

[TestMethod] 
public void Baz_ReturnsDoStuffValueWithBazAppended 
{ 
    // Arrange 
    int testDoStuffReturn = 1; 
    Mock<Foo> mock = new Mock<Foo>(); 
    mock.CallBase = true; 
    mock 
     .Setup(s => s.DoStuff(It.IsAny<int>()) 
     .Returns(testDoStuffReturn); 

    // Act 
    var results = mock.Object.Baz(5); 

    // Assert 
    Assert.AreEqual(string.Format("{0}{1}", results, "Baz"), results); // Validates the result 
    mock.Verify(v => v.DoStuff(It.IsAny<int>())); // Verifies that DoStuff was called 
} 

, yaklaşık Bar() ve sadece umurumda değil

012: biz DoStuff(int) değer verdiğim şey, bir değer döndüren (. ama nasıl o değerde geldiğinde)

Ve nihayet DoStuff(int) olmasıdır

[TestMethod] 
public void DoStuff_ReturnsParameterPlusOne() 
{ 
    // Arrange 
    Foo foo = new Foo(); 
    int passed = 1; 
    int expected = passed + 1; 

    // Act 
    var results = foo.DoStuff(passed); 

    // Assert 
    Assert.AreEqual(expected, results); 
} 
+0

ünite testini de başarısız mı, yoksa temel veya genişletilmiş sınıfı kullanmalı mıyım yoksa program için önemli değil mi? (Mock'ta parametre) – codeislife

+0

Sorunuzu anlamıyorum, ne demek istediğiyle ilgili örneklerle sorununuzu çözebilir misiniz? – Kritner

+0

Parametre gerçekten ne anlama geliyor Mock Ne gerekir? olabilir mi? Özür dilerim, sözdizimini tam olarak anlamıyorum. Açıklığa kavuşturmak için, sahte, kodlarıma kırılma noktaları koyduğumda, kesme noktalarının ben alay ettiğim yöntemleri atlaması gerektiği anlamına gelir. Ben haklı mıyım – codeislife

İlgili konular