MSTEST0065: Evite Assert.AreEqual em tipos de coleção

Property Valor
ID da regra MSTEST0065
Título Evite Assert.AreEqual em tipos de coleção
Categoria Uso
Correção interruptiva ou sem interrupção Non-breaking
Habilitado por padrão Yes
Severidade padrão Warning
introduzido na versão 4.3.0
Há uma correção de código No

Note

Essa regra está disponível a partir do MSTest 4.3.

A partir do MSTest 4.3.3, a regra não relata tipos de coleção que declaram seu próprio comportamento de igualdade.

Cause

Uma chamada a Assert.AreEqual ou Assert.AreNotEqual é feita sobre um valor cujo tipo estático implementa IEnumerable<T> (exceto String).

Descrição da regra

AreEqual e AreNotEqual usam EqualityComparer<T>.Default. Para a maioria dos tipos de coleção — por exemplo, arrays, List<T> ou qualquer tipo definido pelo usuário que implemente IEnumerable<T> — isso recorre à igualdade por referência (ou a qualquer critério de igualdade definido pelo próprio tipo), e não à comparação elemento por elemento. Como resultado, a declaração quase nunca afirma o que o autor do teste pretendia.

[TestClass]
public class TestClass
{
    [TestMethod]
    public void Test()
    {
        var expected = new[] { 1, 2, 3 };
        var actual = new[] { 1, 2, 3 };

        // Violation: this compares references, not contents, and fails.
        Assert.AreEqual(expected, actual);
    }
}

Como corrigir violações

Escolha a declaração que corresponde à sua intenção:

  • Use Assert.AreSequenceEqual para comparação ordenada em termos de elemento.
  • Use Assert.AreSequenceEqual(expected, actual, SequenceOrder.InAnyOrder) para comparação não ordenada em termos de elemento.
  • Use Assert.AreEquivalent para comparação estrutural profunda.
[TestClass]
public class TestClass
{
    [TestMethod]
    public void Test()
    {
        var expected = new[] { 1, 2, 3 };
        var actual = new[] { 1, 2, 3 };

        Assert.AreSequenceEqual(expected, actual);
    }
}

Quando suprimir avisos

Suprima este aviso somente se o tipo definir seu próprio Equals/GetHashCode para comparar conteúdos e você intencionalmente depender disso.

Suprimir um aviso

Se você quiser suprimir apenas uma única violação, adicione diretivas de pré-processador ao arquivo de origem para desabilitar a regra e, em seguida, habilitá-la novamente.

#pragma warning disable MSTEST0065
// The code that's violating the rule is on this line.
#pragma warning restore MSTEST0065

Para desabilitar a regra em um arquivo, uma pasta ou um projeto, defina a severidade como none no arquivo de configuração.

[*.{cs,vb}]
dotnet_diagnostic.MSTEST0065.severity = none

Para obter mais informações, consulte Como suprimir avisos de análise de código.