Udostępnij za pośrednictwem


Testy jednostkowe metod ogólnych

Możesz wygenerować testy jednostkowe dla metody rodzajowe dokładnie, podobnie jak w przypadku innych metod, zgodnie z opisem w Jak: Utwórz i uruchom Test jednostki.W poniższych sekcjach przedstawiono informacje i przykłady tworzenia testów jednostkowych dla metody rodzajowe.

Argumentów typu i ograniczenia typu

Gdy Visual Studio generuje testów jednostkowych dla klasy rodzajowe, takie jak MyList<T>, generuje dwie metody: generic pomocnika i metody badawcze.Jeśli MyList<T> ma jedno lub więcej ograniczeń typu, argument Typ musi spełniać wszystkie ograniczenia typu.Aby upewnić się, że typowa kod w obszarze test działa zgodnie z oczekiwaniami we wszystkich dopuszczalnych danych wejściowych, metody badania wywołuje metodę rodzajowy pomocnika z ograniczeniami, które chcesz przetestować.

Przykłady

Poniższe przykłady ilustrują testy jednostkowe dla elementów Generic:

  • Edytowanie wygenerowany kod Test.W tym przykładzie ma dwie sekcje, wygenerowany kod badania i edytować kod Test.Pokazuje, jak edytować kod raw test, który jest generowany na podstawie metody rodzajowej do metody użytecznym badaniem.

  • Używanie ograniczeń typu.Ten przykład pokazuje testów jednostkowych używający ograniczenie typu metody rodzajowej.W tym przykładzie ograniczenie typu nie jest spełniony.

Przykład 1: Edycja kodu wygenerowanego testu

Badania kodu testu w tej sekcji kodu w obszarze badań metodę o nazwie SizeOfLinkedList().Ta metoda zwraca całkowitą, która określa liczbę węzłów w połączonej listy.

Pierwszy kod przykładowy, w sekcji kodu testu wygenerowane, pokazuje test bez edycji kod jak został wygenerowany przez Visual Studio Premium lub Visual Studio Ultimate.Druga próbka, w sekcji kodu testu edytowany, pokazuje, jak można wprowadzić testować funkcjonowanie metoda SizeOfLinkedList dla dwóch różnych typów danych, int i char.

Ten kod ilustruje dwie metody:

  • metody pomocnika test, SizeOfLinkedListTestHelper<T>().Metody pomocnika test ma domyślnie "TestHelper" w jego imieniu.

  • Metoda badania, SizeOfLinkedListTest().Każda metoda badania jest oznaczony atrybutem TestMethod.

Test wygenerowany kod

W poniższym kodzie test został wygenerowany z SizeOfLinkedList() metody.Ponieważ jest to bez edycji wygenerowanego test, musi być zmodyfikowany, aby poprawnie metoda SizeOfLinkedList badania.

public void SizeOfLinkedListTestHelper<T>()
{
    T val = default(T); // TODO: Initialize to an appropriate value
    MyLinkedList<T> target = new MyLinkedList<T>(val); // TODO: Initialize to an appropriate value
    int expected = 0; // TODO: Initialize to an appropriate value
    int actual;
    actual = target.SizeOfLinkedList();
    Assert.AreEqual(expected, actual);
    Assert.Inconclusive("Verify the correctness of this test method.");
}

[TestMethod()]
public void SizeOfLinkedListTest()
{
   SizeOfLinkedListTestHelper<GenericParameterHelper>();
}

W poprzednim kodzie parametr typu rodzajowego jest GenericParameterHelper.Konieczne będzie można edytować go do dostarczania określonych typów danych, jak pokazano w poniższym przykładzie, można uruchomić test bez konieczności edytowania tej instrukcji.

Edytowane kodu testu

W poniższym kodzie, metody badań i metody pomocnika badania zostały opuszczone do ich pomyślnie metody badania kodu na obszarze badania SizeOfLinkedList().

Metoda pomocnika badania

Metody pomocnika badania wykonuje następujące czynności, które odnoszą się do wierszy w kodzie oznaczone kroki 1 do 5.

  1. Utwórz listę połączonych rodzajowy.

  2. Cztery węzły należy dołączyć do połączonej listy.Typ danych treści tych węzłów jest nieznany.

  3. Przewidywany rozmiar połączonej listy należy przypisać zmiennej expected.  

  4. Obliczyć rzeczywisty rozmiar połączonej listy i przypisać ją do zmiennej actual.

  5. Porównaj actual z expected w instrukcji Assert.Jeśli rzeczywiste nie jest równa oczekiwanej, test zakończy się niepowodzeniem.

Metoda badania

Metody badania jest kompilowany do kodu, który jest wywoływane, gdy zostanie wykonany test o nazwie SizeOfLinkedListTest.Wykonuje następujące kroki, które odpowiadają wierszom w kodzie oznaczone kroki 6 i 7.

  1. Określ <int> podczas wywołania metody pomocnika badania, aby sprawdzić, czy badanie działa dla integer zmiennych.

  2. Określ <char> podczas wywołania metody pomocnika badania, aby sprawdzić, czy badanie działa dla char zmiennych.  

public void SizeOfLinkedListTestHelper<T>()
{
    T val = default(T); 
    MyLinkedList<T> target = new MyLinkedList<T>(val); // step 1
    for (int i = 0; i < 4; i++) // step 2
    {
        MyLinkedList<T> newNode = new MyLinkedList<T>(val);
        target.Append(newNode);
    }
    int expected = 5; // step 3
    int actual;
    actual = target.SizeOfLinkedList(); // step 4
    Assert.AreEqual(expected, actual); // step 5
}

[TestMethod()]
public void SizeOfLinkedListTest() 
{
    SizeOfLinkedListTestHelper<int>();  // step 6
    SizeOfLinkedListTestHelper<char>(); // step 7
}

[!UWAGA]

Zawsze uruchamia SizeOfLinkedListTest test, jego TestHelper jest wywoływana dwa razy.Instrukcja assert musi dawać w wyniku wartości true zawsze w teście przejść.Jeśli test wypadnie niepomyślnie, może nie być jasne, czy wywołanie określony <int> lub wezwanie, że określone <char> wywołało jego nie powiedzie się.Aby znaleźć odpowiedź na pytanie, można zbadać stos wywołań lub można ustawić punkty przerwania w swojej metodzie badania, a następnie debugowania podczas wykonywania badania.Aby uzyskać więcej informacji, zobacz Porady: debugowanie podczas przeprowadzania testu w rozwiązaniu ASP.NET.

Przykład 2: Używanie ograniczenie typu

Ten przykład pokazuje testów jednostkowych metody rodzajowej, który używa typu ograniczenie, które nie jest spełniony.Pierwsza sekcja zawiera kod z projektu kod w obszarze badania.Ograniczenie typu jest podświetlony.

Druga sekcja zawiera kod z badania projektu.

Kod w obszarze badania projektu

using System;
using System.Linq;
using System.Collections.Generic;
using System.Text;

namespace ClassLibrary2
{
    public class Employee
    {
        public Employee(string s, int i)
        {
        }
    }

    public class GenericList<T> where T : Employee
    {
        private class Node
        {
            private T data;
            public T Data
            {
                get { return data; }
                set { data = value; }
            }
        }
    }
}

Projekt testu

Podobnie jak w przypadku wszystkich testów jednostkowych nowo wygenerowanym,-jednoznaczne instrukcje Assert należy dodać do tego testu jednostki, aby stał się zwracać wyniki przydatne.Nie dodasz je do metody oznaczone atrybutem TestMethod, ale do metody "TestHelper", która w tym teście nosi nazwę DataTestHelper<T>().

W tym przykładzie parametr typu Typowa T ma ograniczenie where T : Employee.To ograniczenie nie został spełniony w metodzie badania.W związku z tym DataTest() metoda zawiera instrukcję Assert, która wyświetla alerty o wymogu dostarczania ograniczenie typu, który został umieszczony na T.Wiadomość ta instrukcja Assert otrzymuje brzmienie:("No appropriate type parameter is found to satisfies the type constraint(s) of T. " + "Please call DataTestHelper<T>() with appropriate type parameters.");

Innymi słowy, jeśli zadzwonisz pod DataTestHelper<T>() metodę z metodą badania, DataTest(), musi przekazać parametr typu Employee lub Klasa pochodna od Employee.

using ClassLibrary2;

using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace TestProject1

{
    [TestClass()]
    public class GenericList_NodeTest
    {
    
        public void DataTestHelper<T>()
            where T : Employee
        {
            GenericList_Shadow<T>.Node target = new GenericList_Shadow<T>.Node(); // TODO: Initialize to an appropriate value
            T expected = default(T); // TODO: Initialize to an appropriate value
            T actual;
            target.Data = expected;
            actual = target.Data;
            Assert.AreEqual(expected, actual);
            Assert.Inconclusive("Verify the correctness of this test method.");
        }

        [TestMethod()]
        public void DataTest()
        {
            Assert.Inconclusive("No appropriate type parameter is found to satisfies the type constraint(s) of T. " +
            "Please call DataTestHelper<T>() with appropriate type parameters.");
        }
    }
}

Zobacz też

Koncepcje

Weryfikowanie kodu przy użyciu testów jednostkowych

Inne zasoby

Anatomia Test jednostki