2016-03-26 36 views
-1
interface ITest 
{ 
    void Run(); 
} 

class Test : ITest 
{ 
    void ITest.Run() => Run(); 
    public int Run() 
    { 
     //... 
    } 
} 

Merhaba, ITest.Run() yönteminin Testin "Çalıştır" ı yürütülmesi nasıl doğrulanır?Arabirim Yöntemi nasıl test edilir

+0

"Çalıştır" dönüş değerini kullanabilir veya bir şey yazdırabilirsiniz, hata ayıklayabilirsiniz ... Bunu yapmak için birden fazla yol var ... – Ian

+0

Ben mock.Verify (m) gibi bir şey yapmak istiyorum => m.Run(), Times.Once()); Ama bunu nasıl yapabileceğimi anlamıyorum. – Serg046

+0

Bu, kullandığınız alay konusu Framework'e bağlıdır. Şu an kullanmakta olduğunuzu belirtin misiniz? –

cevap

0

Arabirim başka bir sınıfta kullanılmadığı sürece, Çalıştır'ın çağrıldığını doğrulamak mantıklı değildir. (bunu uygulayan sınıf değil). Eğer ITest-arayüzünü KULLANARAK ikinci sınıf var ise, o zaman

+0

Ben test sınıfını test ediyorum (ITest arabirimi değil) – Serg046

1

yaptığı gibi çalıştır denir doğrulamak için mantıklı Sen olabilir testi Moq gibi bu kullanarak alaycı çerçevesi:

public interface ITest 
{ 
    void Run(); 
} 

public class Test : ITest 
{ 
    void ITest.Run() => Run(); 

    public virtual int Run() 
    { 
     return 1; // doesn’t matter, will be replaced by our mock 
    } 
} 

Test sonra bu şekilde görünecektir: ITest.RunTest ait Run çağırmaz zaman

// arrange 
Mock<Test> mock = new Mock<Test>(); 
mock.CallBase = true; 
mock.Setup(t => t.Run()).Returns(1); 

// act 
ITest test = mock.Object; 
test.Run(); 

// assert 
mock.Verify(t => t.Run(), Times.Once()); 

Bu doğru atar. Bununla birlikte, görebildiğiniz gibi, bunu yapmak, sanal aygıtın sanal olması için Run yöntemini gerektirir, böylece alay kendi uygulamasıyla üzerine yazabilir. Bu arzu edilmeyebilir.

Ve sonuç olarak, bu sınama hiçbir anlam ifade etmemektedir. Birim bir şey sınandığında, birim değil, uygulama için davranışını test etmek istersiniz. Bu nedenle, ITest.Run açık uygulamasının nesne üzerinde başka bir yöntem çağırıp çağıramayacağını farketmemelisiniz. Sadece bu yöntemin çağrılmasının doğru olduğuna dikkat etmelisiniz.

+0

mock.CallBase = true ... – Serg046

+0

için teşekkürler. – Serg046

+0

@ Serg046 Cevaplarımda açıkladığım gibi, * sınıfın * 'Test' yöntemini bu durumda sanallaştırmadan test etmenin bir yolu yoktur, aksi taktirde alay onu geçersiz kılabilir. Kabul edilen yanıtın 'Test' sınıfını hiç sınamadığını, ancak yalnızca arabirimi test ettiğini (ve aslında yalnızca arabirimi uygulayan sahte aracın, yöntem çağrıldığında yöntemi çağırdığını) unutmayın. – poke

1

Arabirimi test etmek en kolay görev! Sen, bir göz atın Typemock Isolator (gerekmez sanal yöntemlerle) ile bunu basitçe yapabilirsiniz:

[TestMethod, Isolated] 
public void TestRun() 
{ 
    //Arrange 
    var fake = Isolate.Fake.Instance<ITest>(); 
    Isolate.WhenCalled(() => fake.Run()).CallOriginal(); 

    //Act 
    fake.Run(); 

    //Assert 
    Isolate.Verify.WasCalledWithAnyArguments(() => fake.Run()); 
} 

Ardından() yöntemini çalıştırmak için çalışma biçimini ayarlamak, arayüz alay ediyorsunuz (isteğe bağlıdır) ve sonuçta sen Aramanın yapıldığını doğrulayabilir.

Umut eder!

+1

Bu, yararlı bir şey yapmaz. Arayüzün sahte/sahte bir uygulamasını sağlıyor, arayüzün yöntemini çağırıyorsunuz ve daha sonra kesin yöntemin (testte açıkça yaptığınız) aranıp uygulanmadığını kontrol ediyorsunuz. Bu OP’nin “Test” sınıfını hiç test etmiyor. – poke

İlgili konular