Partilhar via


Testes de unidade e métodos genéricos

Você pode gerar testes de unidade para métodos genéricos exatamente sistema autônomo faz para outros métodos, conforme descrito em Como: Gerar um teste de unidade. As seções a seguir fornecem informações sobre e exemplos de criação de testes de unidade para métodos genéricos.

Argumentos de tipo e restrições de tipo

Quando Visual Studio gera um teste de unidade para uma classe genérica, sistema autônomo MyList<T>, ele gera dois métodos: um auxiliar genérico e um método de teste.If MyList<T> tem um ou mais restrições de tipo, o argumento de tipo deve satisfazer a todas as restrições de tipo. Para certificar-se de que a genérica código sob teste funciona conforme o esperado para entradas de todos sistema autônomo permitidos, o método de teste chama o método auxiliar genérico com sistema autônomo restrições que você deseja testar.

Exemplos

Os exemplos a seguir ilustram testes de unidade para classes genéricas:

  • Edição de código de teste gerado.Este exemplo tem duas seções, código de teste gerado e o código de teste editado.Ele mostra como edição o código de teste bruto é gerado a partir de um método genérico em um método de teste úteis.

  • Usando uma restrição de tipo.Este exemplo mostra um teste de unidade para um método genérico que usa uma restrição de tipo.Neste exemplo, a restrição de tipo não é satisfeita.

Exemplo 1: Edição de código de teste gerado

O código de teste desta seção testa um método do código sob teste chamado SizeOfLinkedList(). Esse método retorna um número inteiro que especifica o número de nós na lista vinculada.

O primeiro exemplo de código, na seção código de teste geradas, mostra o código de teste não-editadas sistema autônomo-w sistema autônomo gerados por Visual Studio Team System Test Edition. O segundo exemplo, na seção código de teste editada, mostra como você poderia fazer testar o funcionamento do método SizeOfLinkedList para dois tipos de dados diferentes, int e char.

Este código ilustra dois métodos:

  • um método auxiliar de teste, SizeOfLinkedListTestHelper<T>(). Por padrão, um método auxiliar de teste possui "TestHelper" em seu nome.

  • um método de teste, SizeOfLinkedListTest(). Cada método de teste é marcado com o atributo TestMethod.

Código de teste gerados

O seguinte código de teste foi gerado a partir de SizeOfLinkedList() método. Como esse é o teste gerados não-editado, deve ser modificado para testar o método SizeOfLinkedList corretamente.

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>();

}

No código anterior, o parâmetro de tipo genérico é GenericParameterHelper. Ao passo que você possa editá-lo para fornecer tipos de dados específicos, conforme mostrado no exemplo a seguir, você pode executar o teste sem edição essa demonstrativo.

Código de teste editada

O código a seguir, o método de teste e o método auxiliar de teste foram editadas para torná-los com sucesso testar o código under teste-método SizeOfLinkedList().

Método do teste auxiliar

O método auxiliar de teste executa as seguintes etapas, que correspondem às linhas de código rotulado etapas 1 a 5.

  1. Crie uma lista vinculada genérica.

  2. Acrescente quatro nós à lista vinculada.O tipo de dados do Sumário de um de nós é desconhecido.

  3. Atribuir o dimensionar esperado do lista vinculada a variável expected.

  4. Calcular o dimensionar real da lista vinculada e os atribui à variável actual.

  5. Comparar actual com expected em uma demonstrativo Assert. Se o real não for igual ao esperado, o teste falhar.

Método de teste

O método de teste é compilado no código que é chamado quando você executar o teste chamado SizeOfLinkedListTest.Ele executa as seguintes etapas, que correspondem às linhas de código rotulado etapas 6 e 7.

  1. Especificar <int> Quando você chama o método de auxiliar de teste, para verificar se o teste funciona para integer variáveis.

  2. Especificar <char> Quando você chama o método de auxiliar de teste, para verificar se o teste funciona para char variáveis.

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
}
Observação:

Cada time teste SizeOfLinkedListTest é executado, seu método TestHelper é chamado duas vezes .A demonstrativo de demonstrativo deve ser avaliada como verdadeiro cada vez para o teste passe.Se o teste falhar, não pode ser clara pr a telefonar especificada Ether <int> ou a telefonar especificada <char> fez a sua falha. Para encontrar a resposta, você pode examinar o telefonar pilha ou você pode conjunto pontos de interrupção no seu método de teste e, em seguida, depurar ao executar o teste.Para obter mais informações, consulte Como: depurar while Running a teste in an ASP.NET solução.

Exemplo 2: Usando uma restrição de tipo

Este exemplo mostra um teste de unidade para um método genérico que usa uma restrição de tipo não é satisfeita.A primeira seção mostra o código do código - em-projeto de teste.Restrição de tipo é realçada.

A segunda seção mostra o código do projeto de teste.

Projeto de código sob teste

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

Projeto de Teste

sistema autônomo ocorre com todos sistema autônomo testes de unidade recém-gerado, você deve adicionar instruções Assert não inconclusivos para esse teste de unidade para torná-la retornar resultados úteis.Você não adiciona-los para o método marcado com o atributo TestMethod mas para o método "TestHelper", que é chamado para este testeDataTestHelper<T>().

Neste exemplo, o generic digite parâmetro T tem a restrição where T : Employee. Essa restrição não é atendida no método de teste.Portanto, a DataTest() método contém uma demonstrativo Assert que o alerta para a necessidade de fornecer a restrição de tipo que foi colocada no T. A mensagem desta demonstrativo Assert lido conforme segue: ("No appropriate type parameter is found to satisfies the type constraint(s) of T. " + "Please call DataTestHelper<T>() with appropriate type parameters.");

Em outras palavras, quando você liga o DataTestHelper<T>() método a partir do método de teste, DataTest(), você deve passar um parâmetro de tipo Employee ou uma classe derivada de 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.");
        }
    }
}

Consulte também

Outros recursos

Visão geral de testes de unidade

Criando Testes de Unidade