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.
Crie uma lista vinculada genérica.
Acrescente quatro nós à lista vinculada.O tipo de dados do Sumário de um de nós é desconhecido.
Atribuir o dimensionar esperado do lista vinculada a variável expected.
Calcular o dimensionar real da lista vinculada e os atribui à variável actual.
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.
Especificar <int> Quando você chama o método de auxiliar de teste, para verificar se o teste funciona para integer variáveis.
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.");
}
}
}