Compartilhar via


Testes de unidade para métodos genéricos

Você pode gerar teste de unidade para métodos genéricos exatamente como você faria para outros métodos, como descrito em Como: criar e executa um teste de unidade.As seções a seguir fornecem informações e exemplos de criar teste de unidade para métodos genéricos.

Argumentos de tipo e restrições do tipo

Quando Visual Studio gerencie um teste de unidade para uma classe genérico, como MyList<T>, gerenciar dois métodos: um auxiliar genérico e um método de teste.Se MyList<T> tem uma ou mais restrições de tipo, o argumento do tipo deve satisfazer todas as restrições de tipo.Para garantir que o código genérico em trabalhos de teste como esperado para todas as entradas permitidas, o método de teste chama o método auxiliar genérica com todas as restrições que você deseja testar.

Exemplos

Os exemplos a seguir ilustram teste de unidade para produtos genéricas:

  • Editar o código de teste gerado.Este exemplo tem duas seções, o código de teste gerado e o código de teste editado.Mostra como editar o código de teste bruto que é gerado a partir de um método genérico em um método útil de teste.

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

Exemplo 1: Editar o código de teste gerado

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

A primeira exemplo de código, no código de teste gerado, seção a seguir mostra o código de teste não editado como foi gerada por Visual Studio Premium ou por Visual Studio Ultimate.O segundo exemplo, no código de teste editado seção, mostra como você pode fazer o testar a operação do método de SizeOfLinkedList para dois tipos de dados, int e chardiferentes.

Este código a seguir ilustra dois métodos:

  • um método auxiliar de teste, SizeOfLinkedListTestHelper<T>().Por padrão, um método auxiliar de teste “tem TestHelper” no nome.

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

Código de teste gerado

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

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.Embora seja possível editar o para fornecer tipos de dados específicos, como mostrado no seguinte exemplo, você pode executar o teste sem editar essa instrução.

Código de teste editado

No código a seguir, o método de teste e o método auxiliar de teste foi editado para fazer com êxito testar o método SizeOfLinkedList()de código-sob- teste.

Método auxiliar de teste

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

  1. Crie uma lista vinculada genérico.

  2. Anexar quatro nós à lista vinculada.O tipo de dados de conteúdo desses nós é desconhecido.

  3. Atribuir o tamanho esperado da lista vinculada a expectedvariável.  

  4. Calcule o tamanho real da lista vinculada e atribuí-lo a actualvariável.

  5. Compare actual com expected em uma instrução declare.Se o real não é igual à esperada, o teste falhar.

Método de teste

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

  1. Especifique <int> quando você chama o método auxiliar de teste, para verificar se o trabalho de teste para variáveis de integer .

  2. Especifique <char> quando você chama o método auxiliar de teste, para verificar se o trabalho de teste para variáveis de char .  

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çãoObservação

Cada vez que as execuções de teste de SizeOfLinkedListTest, o método de TestHelper são chamados duas vezes em.A instrução declare deve avaliar para retificar todas as vezes para que o teste definido.Se o teste falhar, talvez não seja claro se a chamada que especificou <int> ou a chamada que especificaram <char> o causou a falha.Para localizar a resposta, você pode examinar a pilha de chamadas, ou você pode definir pontos de interrupção em seu método de teste e depois depurar-los durante a execução do teste.Para obter mais informações, consulte Como depurar durante a execução de um teste em uma solução do ASP.NET.

Exemplo 2: Usando uma restrição de tipo

Este exemplo mostra um teste de unidade de um método genérico que use uma restrição de tipo que não é atendida.O primeiro código mostra a seção de projeto de código-sob- teste.A restrição de tipo é destacada.

O segundo código mostra a seção de 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

Como com qualquer teste recentemente gerados de unidade, você deve adicionar não inconsequente afirma instruções para esse teste de unidade para torná-lo retornar resultados úteis.Você não adiciona ao método marcado com o atributo de TestMethod mas o método de “TestHelper”, que para este teste é nomeada DataTestHelper<T>().

Neste exemplo, o parâmetro de tipo genérico T tem a restrição where T : Employee.Essa restrição não for satisfeita no método de teste.Em virtude disso, o método de DataTest() contém uma instrução declare alertas que você fornecer ao requisito a restrição de tipo que foi colocada em T.A mensagem desta afirma leitura da instrução seguinte maneira: ("No appropriate type parameter is found to satisfies the type constraint(s) of T. " + "Please call DataTestHelper<T>() with appropriate type parameters.");

Ou seja quando você chama o método de DataTestHelper<T>() do método de teste, DataTest(), você deve transmitir 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

Conceitos

Verificando código usando testes de unidade

Outros recursos

Anatomia de um teste de unidade