NUnit. Значения отличаются в индексе [0] - PullRequest
7 голосов
/ 13 марта 2012

Я запускаю тест, но если не получается, я не знаю почему:

Proj.Tests.StatTests.GetResults_RegularPage_ReturnListOfResults:
  Expected and actual are both <System.Collections.Generic.List`1[Proj.Classes.StatResult]> with 50 elements
  Values differ at index [0]
  Expected: <test;98318>
  But was:  <test;98318>

Как видите, значения идентичны. Вот некоторый код:

public class StatResult
    {
        public string word { get; set; }
        public UInt64 views { get; set; }

        public override string ToString()
        {
            return String.Format("{0};{1}", word, views);                
        }
    }    

    [Test]
    public void GetResults_RegularPage_ReturnListOfResults()
    {
        // Arrange            
        WordStat instance = new WordStat(Constants.WordStatRegularPage);
        // Act
        List<StatResult> results = instance.GetResults();
        // Assert
        Assert.AreEqual(results, new List<StatResult>
        {
            new WordStatResult { word ="test", views = 98318},
            new WordStatResult { word ="test board", views = 7801},
            //... I shorted it
        }

}

Я много пробовал, даже помещая тестовый образец прямо в класс, но он все равно не работает. Пожалуйста, помогите!

Ответы [ 3 ]

7 голосов
/ 13 марта 2012

Проблема в том, что NUnit проверяет равенство двух экземпляров StatResult.Поскольку вы не реализуете какой-либо вид оператора сравнения на равенство, проверка на равенство по умолчанию используется для ссылки на экземпляр.Поскольку это два разных экземпляра, их ссылки различны.

См. эту статью для получения дополнительной информации о реализации равенства в ваших объектах.

5 голосов
/ 13 марта 2012

Я вижу, что две ссылки относятся к объектам с одинаковыми свойствами, но это не то, что здесь тестируется. Он проверяет, являются ли они ссылками на один и тот же объект или равны ли они. Ваш класс StatResult не переопределяет Equals / GetHashCode, поэтому два объекта с одинаковыми значениями будут рассматриваться как "разные" для тестирования.

Вы должны переопределить Equals и GetHashCode, чтобы два объекта считались равными соответственно. Я бы также предложил сделать тип неизменяемым, а также следовать обычным правилам именования .NET для свойств:

public sealed class StatResult : IEquatable<StatResult>
{
    public string Word { get; private set; }
    public UInt64 Views { get; private set; }

    public StatResult(string word, ulong views)
    {
        this.word = word;
        this.views = views;
    }

    public override string ToString()
    {
        return String.Format("{0};{1}", word, views);                
    }

    public override int GetHashCode()
    {
        int hash = 23;
        hash = hash * 31 + Word == null ? 0 : Word.GetHashCode();
        hash = hash * 31 + Views.GetHashCode();
        return hash;
    }

    public override bool Equals(object other)
    {
        return Equals(other as StatResult);
    }

    public bool Equals(StatResult other)
    {
        return other != null &&
               this.Word == other.Word &&
               this.Views == other.Views;
    }
}

Ваша конструкция просто изменится на:

new StatResult("test", 98318),
new StatResult("test board", 7801),

(и аналогично в вашем производственном коде).

1 голос
/ 13 марта 2012

Вам необходимо переопределить Equals () и GetHashCode (). На данный момент он проверяет, является ли первый элемент в каждом списке ссылкой на тот же объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...