В чем разница между EqualTo () и EquivalentTo () в NUnit? - PullRequest
10 голосов
/ 29 июня 2011

Когда у меня есть Dictionary<string, int> actual, а затем создается совершенно новый Dictionary<string, int> expected с теми же значениями, что и у фактического.

  • Вызов Assert.That(actual, Is.EqualTo(expected)); делает тестовый проход.

  • При использовании Assert.That(actual, Is.EquivalentTo(expected)); тест не проходит.

В чем разница между EqualTo() и EquivalentTo()?

Редактировать:

Сообщение об исключении, когда тест не проходит, выглядит следующим образом:

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]] >

Мой код выглядит следующим образом:

[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;
}

Ответы [ 2 ]

9 голосов
/ 12 марта 2014

Название вопроса заставляет меня заявить следующее:

Для перечислений Is.EquivalentTo() выполняет сравнение, разрешая любой порядок элементов. Напротив, Is.EqualTo() учитывает точный порядок элементов, как Enumerable.SequenceEqual().

Однако в вашем случае нет проблем с заказом. Главное здесь то, что Is.EqualTo() имеет дополнительный код для словарного сравнения, как указано здесь .

Не так Is.EquivalentTo(). В вашем примере он будет сравнивать значения типа KeyValuePair<string,List<int>> на равенство, используя object.Equals(). Поскольку значения словаря относятся к ссылочному типу List<int>, для их сравнения используется равенство ссылок.

Если вы измените свой пример так, чтобы список {1, 2} создавался только один раз и использовался в обоих словарях, Is.EquivalentTo() будет успешным.

2 голосов
/ 29 июня 2011

у меня оба работают:

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() внутри NUnit, если оба объекта ICollection, использует CollectionsEqual(x,y), который повторяет оба, чтобы найти разницу. Я думаю, это равно Enumerable.SequenceEqual(x,y)

  • Is.EquivalentTo делает это немедленно, потому что поддерживает только последовательности: EquivalentTo(IEnumerable)

...