2011-11-17 25 views
9

Birim testi kullanmayı, bir proje oluşturmayı, xunit referansı eklemeyi öğreniyorum. ve aşağıdaki Kodu: i xunit GUI alet testi zamanNeden xunit parametreler içeren bir yöntemi test etmesine izin vermiyor?

namespace UnitTestProject 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     [Fact] 
     private void test(int number1, string number2) 
     { 

      int result = number1 + Convert.ToInt32(number2); 
      Assert.IsType(Type.GetType("Int32"), result); 
     } 
     private void Form1_Load(object sender, EventArgs e) 
     { 

     } 
    } 
} 

, söz konusu:

UnitTestProject.Form1.test: iletisi: Gerçek yöntem UnitTestProject.Form1.test olamaz 於 Xunit.Sdk.FactCommand.Execute (TestClass Nesne)
Xunit.Sdk.FixtureCommand.Execute (Nesne TestClass)
Xunit.Sdk.BeforeAfterCommand.Execute (TestClass Nesne): parametreleri Yığın İzleme var Xunit.Sdk.LifetimeCommand.Execute (Nesne TestClass)
Xunit.Sdk.ExceptionAndOutputCaptureCommand.Execute (Nesne TestClass) Böylece

, nasıl parametrelerle yöntemi/işlevini test edebilirsiniz?

cevap

18

ile mümkündür. Farklı parametrelerle test yöntemleri oluşturmanıza izin verecektir. E.g.

[Theory] 
[InlineData(1, "22")] 
[InlineData(-1, "23")] 
[InlineData(0, "-25")] 
public void test(int number1, string number2) 
{ 
    int result = number1 + Convert.ToInt32(number2); 
    Assert.IsType(Type.GetType("Int32"), result); 
} 

Not; XUnit ile test yöntemlerini herkese açık hale getirmek daha iyi olurdu.

+0

teşekkürler, ama InlineData'yı rastgele bir değere ayarlayabilir miyim? Veya daha iyi söylemek gerekirse InlineData inline method/variable kabul edebilir mi? – Cheung

+0

Bunu neden yapabilirsiniz. Aşağıdaki kirli bir örneğe bakın. – Alina

+1

@ Shiba genellikle testlerinizde rastgele değerler kullanmamalısınız. Örnek yönteminizde, rasgele bir sayının başarısız olması durumunda, sorunun neden sayıların ne olduğu konusunda hiçbir fikriniz olmayacaktır. Testlerinizi deterministik hale getirmeye çalışın ve bir dizi beklenen, beklenmedik ve aşırı girişte besleyin. – DaveShaw

2

Xunit, argümanlar için neleri nasıl tedarik edeceğini nasıl bilecektir? Bir birim testinde, verileri içeren bir ortam oluşturan, gerekli eylemi gerçekleştiren ve sonuçların beklendiği gibi olduğunu iddia eden, kendi kendine yeten bir test olması gerekir. Testiniz, number1 ve number2 için harici değerlere bağlı olduğu için kendi içinde bulunmaz. Aşağıdaki deneyin:

[Fact] 
private void TestAdd() { 
    //arrange 
    int number1 = 10; 
    string number2 = "10"; 

    //act 
    object result = Add(number1,number2); 

    //assert 
    Assert.IsType(Type.GetType("Int32"), result); 
} 

private object Add(int number1, string number2) 
{ 
    return number1 + Convert.ToInt32(number2); 
} 

şey nota, ne (parametreli birim testi) yapmaya çalışıyoruz Ayrıca [Theory] yerine [Fact] kullanabilirsiniz Pex aracı

+0

Teşekkürler. Ancak bugün birçok uygulama son kullanıcı ile etkileşime giriyor. Örneğin, işim çoğunlukla hesap sistemi, envanter sistemi gibi işler. Kullanıcının girdi verilerini kabul edemem. Bende yeni, ünite testinin değerini hala buluyorum. – Cheung

+2

İşlevleriniz belirli veri aralıklarını kabul etmelidir. Tipik olarak, bu aralığın taşıyıcılarını, istisnai durumları ve daha sonra menzilde (aklı için) bir şeyi test edersiniz. Ama Pex'e göz atın, fonksiyonlarınızı test etmek için giriş verileri üretecektir – flipchart

+0

Teşekkürler, Pex istediğim gibi. – Cheung

14

Testlerde rastgele değerler ve satır içi yöntemler/değişkenler hakkında. Bu kod, testiniz için 100 rastgele int/string çifti üretir.

[Theory] 
    [PropertyData("GetTestData")] 
    public void test(int number1, string number2) 
    { 

     int result = number1 + Convert.ToInt32(number2); 
     var expectedType = Type.GetType("System.Int32"); 
     Assert.IsType(expectedType, result); 
    } 

    public static IEnumerable<object[]> GetTestData 
    { 
     get { return Enumerable.Repeat(0, 100).Select(x => GenerateTestData()); } 
    } 

    private static object[] GenerateTestData() 
    { 
     var rand = new Random(0); 
     return new object[] {rand.Next(0,100), rand.Next(0,100).ToString()}; 
    } 
+0

Çok teşekkürler! – Cheung

+0

Rica ederim. – Alina

+0

Ama neden? Başarısız olursa, onu yeniden üretemezsiniz. Testinize sabitledikten sonra setinizi rastgele değerler ile üretin. –

İlgili konular