MSTEST0065: Evitar Assert.AreEqual nos tipos de cobrança

Property Valor
ID da regra MSTEST0065
Title Evite Assert.AreEqual nos tipos de cobrança
Category Utilização
A correção é invasiva ou não invasiva Inquebrável
Ativado por padrão Yes
Severidade padrão Warning
Introduzido na versão 4.3.0
Existe uma correção de código No

Note

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

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

Motivo

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

Descrição da regra

AreEqual e AreNotEqual usar EqualityComparer<T>.Default. Para a maioria dos tipos de coleção — como, por exemplo, arrays, List<T> ou qualquer tipo definido pelo utilizador que implementa IEnumerable<T> — recorre-se à igualdade de referência (ou à igualdade que o próprio tipo define), e não à comparação elemento a elemento. Como resultado, a afirmaçã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 afirmação que corresponda à sua intenção:

  • Use Assert.AreSequenceEqual para comparação ordenada por elementos.
  • Use Assert.AreSequenceEqual(expected, actual, SequenceOrder.InAnyOrder) para comparação elemental não desordenada.
  • Use Assert.AreEquivalent para comparações estruturais profundas.
[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 apenas se o tipo definir o seu Equals/GetHashCode próprio para comparar conteúdos e confiar intencionalmente nisso.

Suprimir um aviso

Se você quiser apenas suprimir uma única violação, adicione diretivas de pré-processador ao seu arquivo de origem para desativar e, em seguida, reativar a regra.

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

Para desabilitar a regra de um arquivo, pasta ou projeto, defina sua gravidade 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.