2011-11-17 9 views
9

Uczę się używać testu jednostkowego, tworzę projekt, dodaję odniesienie do zbioru Xunit. I następujące kody:dlaczego xunit nie pozwala przetestować metody z parametrami?

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) 
     { 

     } 
    } 
} 

Kiedy wykonać test za pomocą narzędzia xUnit gui, to powiedział:

UnitTestProject.Form1.test: System.InvalidOperationException: Fakt metoda UnitTestProject.Form1.test nie może mają parametry stos śladowych: 於 Xunit.Sdk.FactCommand.Execute (Object TestClass)
Xunit.Sdk.FixtureCommand.Execute (Object TestClass)
Xunit.Sdk.BeforeAfterCommand.Execute (Object TestClass)
Xunit.Sdk.LifetimeCommand.Execute (Object TestClass)
Xunit.Sdk.ExceptionAndOutputCaptureCommand.Execute (Object TestClass)

Tak, jak mogę przetestować metody/funkcji z parametrami?

Odpowiedz

18

Pex Również można użyć [Theory] zamiast [Fact]. Pozwoli ci to stworzyć metody testowania o różnych parametrach. 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); 
} 

p.s. Przy pomocy xUnit lepiej byłoby upublicznić metody testowe.

+0

dziękuję, ale czy mogę ustawić InlineData w losowej wartości? Lub lepiej powiedzieć, InlineData akceptować metodę/zmienną inline? – Cheung

+0

Możesz dlaczego nie. Zobacz brudny przykład poniżej. – Alina

+1

@Shiba ogólnie nie powinieneś używać losowych wartości w swoich testach. W twojej przykładowej metodzie, jeśli jedna losowa liczba nie powiedzie się, nie będziesz miał pojęcia, jakie liczby były przyczyną problemu. Postaraj się, aby twoje testy były deterministyczne i wykorzystaj szereg oczekiwanych, nieoczekiwanych i ekstremalnych danych wejściowych. – DaveShaw

2

W jaki sposób xunit wie, co podać jako wartości argumentów? Test jednostkowy musi być samodzielnym testem, który tworzy środowisko z danymi, wykonuje wymagane działanie, a następnie zapewnia, że ​​wyniki są zgodne z oczekiwaniami. Twój test nie jest samowystarczalny, ponieważ opiera się na zewnętrznych wartościach dla number1 i number2. Spróbuj wykonać następujące czynności:

[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); 
} 

Coś pamiętać, że to, co staramy się robić (testy jednostkowe parametryczne) jest możliwe za pomocą narzędzia

+0

Dziękuję. Ale dzisiaj wiele aplikacji wchodzi w interakcje z użytkownikiem końcowym. Na przykład moja praca w większości przypomina pracę w systemie kont, system magazynowy. Nie mogę założyć danych wejściowych użytkownika. Jestem w nim nowy, wciąż znajduję wartość testu jednostkowego. – Cheung

+2

Twoje funkcje powinny akceptować określone zakresy danych. Zazwyczaj testujesz ouliers tego zakresu, wyjątkowe przypadki, a następnie coś w zasięgu (dla zdrowia psychicznego). Ale sprawdź Pex, to wygeneruje dane wejściowe, aby przetestować twoje funkcje. – flipchart

+0

Dzięki, wydaje Ci się, że Pex jest tym, czego chcę. – Cheung

14

Informacje o wartościach losowych i liniowych metod/zmiennych w testach. Ten kod generuje 100 losowych par int/string dla twojego testu.

[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

Dziękuję bardzo! – Cheung

+0

Nie ma za co. – Alina

+0

Ale dlaczego? Jeśli zawiedzie, nie będzie można go odtworzyć. Wygeneruj zestaw z losowymi wartościami po ich naprawieniu w teście. –

Powiązane problemy