Qual é a diferença entre EqualTo () e EquivalentTo () no NUnit?

10

Quando eu tiver um Dictionary<string, int> actual e, em seguida, criar um Dictionary<string, int> expected completamente novo com os mesmos valores reais.

  • Chamar Assert.That(actual, Is.EqualTo(expected)); faz o teste passar.

  • Ao usar Assert.That(actual, Is.EquivalentTo(expected)); , o teste não passa.

Qual é a diferença entre EqualTo() e EquivalentTo() ?

Editar:

A mensagem da exceção quando o teste não passa é a seguinte:

Zoozle.Tests.Unit.PredictionTests.ReturnsDriversSelectedMoreThanOnceAndTheirPositions:
Expected: equivalent to < [Michael Schumacher, System.Collections.Generic.List'1[System.Int32]] >
But was:  < [Michael Schumacher, System.Collections.Generic.List'1[System.Int32]] >

Meu código é assim:

[Test]
public void ReturnsDriversSelectedMoreThanOnceAndTheirPositions()
{
    //arrange
    Prediction prediction = new Prediction();

    Dictionary<string, List<int>> expected = new Dictionary<string, List<int>>()
    {
        { "Michael Schumacher", new List<int> { 1, 2 } }
    };

    //act
    var actual = prediction.CheckForDriversSelectedMoreThanOnce();

    //assert
    //Assert.That(actual, Is.EqualTo(expected));
    Assert.That(actual, Is.EquivalentTo(expected));
}

public Dictionary<string, List<int>> CheckForDriversSelectedMoreThanOnce()
{
    Dictionary<string, List<int>> expected = new Dictionary<string, List<int>>();
    expected.Add("Michael Schumacher", new List<int> { 1, 2 });

    return expected;
}
    
por Garth Marenghi 29.06.2011 в 10:28
fonte

2 respostas

1

Ambos funcionam para mim:

var actual = new Dictionary<string, int> { { "1", 1 }, { "2", 2 } };
var expected = new Dictionary<string, int> { { "1", 1 }, { "2", 2 } };

Assert.That(actual, Is.EqualTo(expected)); // passed
Assert.That(actual, Is.EquivalentTo(expected)); // passed
  • Is.EqualTo() dentro do NUnit, se os dois objetos forem ICollection , usa CollectionsEqual(x,y) , que faz a iteração para encontrar a diferença. Eu acho que é igual a Enumerable.SequenceEqual(x,y)

  • Is.EquivalentTo faz isso imediatamente porque apenas sequências de suporte: EquivalentTo(IEnumerable)

por abatishchev 29.06.2011 / 10:44
fonte
5

O título da pergunta me obriga a afirmar o seguinte:

Para enumerações, Is.EquivalentTo() faz a comparação permitindo qualquer ordem dos elementos. Em contraste, Is.EqualTo() leva em consideração a ordem exata dos elementos, como Enumerable.SequenceEqual() .

No entanto, no seu caso, não há problemas com pedidos. O ponto principal aqui é que Is.EqualTo() tem código extra para comparação de dicionários, como declarado aqui .

Não é assim Is.EquivalentTo() . No seu exemplo, ele irá comparar valores do tipo KeyValuePair<string,List<int>> para igualdade, usando object.Equals() . Como os valores do dicionário são do tipo de referência List<int> , a igualdade de referência é usada para compará-los.

Se você modificar seu exemplo de forma que a Lista {1, 2} seja instanciada apenas uma vez e usada em ambos os dicionários, Is.EquivalentTo() será bem-sucedido.

    
por tm1 12.03.2014 / 11:32
fonte