2013-10-10 3 views
3

Как я могу сделать модульное тестирование этого методаКак я могу выполнить единичный тест этого метода?

public static ICollection<Person> SelectPersonByCountry(string Country, LinkedList<Person> personList) 
    { 
     ICollection<Person> selectedPerson = new List<Person>(); 
      if (Country != String.Empty) 
     { 
      foreach (Person item in personList) 
      { 
        if (item.Country.ToUpper().Equals(Country.ToUpper())) 
        { 
        selectedPerson.Add(item); 
       } 
      } 
     } 
     else 
     { 
      // do something 
      return null; 
     } 
     return selectedPerson; 

Метод CollectionAssert.AreEqual() хотят 2 аргументов ICollection и ICollection, но у меня есть общего ICollections. Что мне нужно сделать?

public void TestMethod1() 
    { 
     string country = "Ukraine"; 

     LinkedList<lab1.Person> personList = new LinkedList<lab1.Person>(); 
     personList.AddFirst(new Person("Dasda", "Sasha", "Ukraine", "23131", "Ukrainian")); 
     personList.AddFirst(new Person("Sasa", "OLeg", "Ukraine", "23131", "Ukrainian")); 
     personList.AddFirst(new Person("Popa", "Sveta", "Ukraine", "23131", "Ukrainian")); 
     personList.AddFirst(new Person("Bezik", "Vitya", "Ukraine", "23131", "Ukrainian")); 
     personList.AddFirst(new Person("Hoi", "Oleg", "Ukraine", "23131", "Ukrainian")); 
     ICollection<Person> expected = new LinkedList<Person>(); 
     expected.Add(new Person("Dasda", "Sasha", "Ukraine", "23131", "Ukrainian")); 
     expected.Add(new Person("Sasa", "OLeg", "Ukraine", "23131", "Ukrainian")); 
     expected.Add(new Person("Popa", "Sveta", "Ukraine", "23131", "Ukrainian")); 
     expected.Add(new Person("Bezik", "Vitya", "Ukraine", "23131", "Ukrainian")); 
     expected.Add(new Person("Hoi", "Oleg", "Ukraine", "23131", "Ukrainian")); 


     ICollection expected1 = (ICollection)expected; 

     ICollection actual = (ICollection)lab1.Person.SelectPersonByCountry(country, personList); 



     CollectionAssert.AreEqual(expected1, actual); 



    } 

Мой метод должен возвращать коллекцию, как ожидается, becouse всего моего лица из «Украины», но тест не прошел ..

+0

Он хочет ожидаемый сбор и фактический один. Я не думаю, что важно, что вы используете общую коллекцию. –

ответ

3

Метод CollectionAssert.AreEqual() хочет 2 аргумента ICollection и ICollection, но у меня есть общие ICollections. Что мне нужно сделать?

Большинство общих коллекций также реализует не общий интерфейс ICollection, поэтому вы можете в любом случае передать общую коллекцию.

ICollection actual = (ICollection)SelectPersonByCountry(country, personList); 
ICollection expected = new[] { person1, person2 }; 

CollectionAssert.AreEqual(actual, expected); 
+0

Ой, спасибо вам, но мой тест не прошло, но у меня есть одни и те же коллекции – handless

+1

Вы уверены, что ваша коллекция имеет тот же порядок элементов? – zabulus

+2

@ user2865903, вы переопределили Equals в классе Person? Если вы этого не сделали, два идентичных, но разных экземпляра Лица будут считаться разными. –

1

Да, в то время как я никогда не использовал CollectionAssert.AreEqual, я уверен, что это будет связано с тем, как выполняется основное сравнение объекта каждого элемента в коллекции. Состояние AreEqual doco;

Элементы равны, если их значения равны, если они не относятся к тому же объекту. Значения элементов сравниваются с использованием Equals по умолчанию .

Я предполагаю, что вы должны убедиться, что ваш объект Person реализует метод Equals, чтобы разрешить сравнение объектов. Ссылка на метод равенства выше состояний;

Метод статических эквивалентов (объект, объект) указывает, равны ли два объекта , objA и objB. Он также позволяет тестировать объекты , значение которых равно null для равенства. Он сравнивает objA и objB для равенства следующим образом:

Определяет, представляют ли эти два объекта ту же ссылку на объект.

Если это так, метод возвращает true. Этот тест эквивалентен вызову метода ReferenceEquals. Кроме того, , если оба objA и objB равны null, метод возвращает true. Он определяет , является ли objA или objB нулевым. Если это так, он возвращает false. Если объекты не представляют одну и ту же ссылку на объект и ни один из них не равен , он вызывает objA.Equals (objB) и возвращает результат. Это означает, что если objA переопределяет метод Object.Equals (Object), это переопределение вызывается.

Смотрите примеры на странице Equals documentaion для идеи о том, как идти о реализации этого для того, чтобы один человек объект на самом деле то же самое, что вы ожидаете.

Edit: Если вы не хотите, чтобы переопределить Equals в вашем Person Object, то, возможно, создать их один раз под тем, где вы определяете переменную страны, а затем добавить и тот же человек записи к вашему LinkedList и вашей ICollection. Таким образом, ссылка, вероятно, будет такой же ... Я думаю.

2

Есть на самом деле два (потенциальные) причины для этого:

Во-первых, порядок списков. Чтобы добавить элементы в personList, вы используете addFirst, который добавляет элемент в список. Чтобы добавить элементы к ожидаемому, вы используете Add, который добавляет элемент в список. Тем не менее, вы передаете людей в том же порядке. Таким образом, ожидаемый и personList имеют отмененный порядок. В документе Doc of CollectionsAssert.AreEquals указывается, что

коллекции должны иметь одинаковый счет и содержать одинаковые объекты в том же порядке.

Во-вторых, человек не может переопределять равные. Если это случай, C# по умолчанию ссылаться на равенство, что означает, что

new Person("Dasda", "Sasha", "Ukraine", "23131", "Ukrainian") 
    .Equals(new Person("Dasda", "Sasha", "Ukraine", "23131", "Ukrainian")) == false 

Есть три способа решения этой проблемы:

  1. Override Равно (и Hashcode) в классе Person
  2. Создайте экземпляры Person один раз и используйте их как в ожидаемых, так и в списках personList. Это решение также снизит риск опечаток, кстати. Но это заставляет ваш тест зависеть от реализации, которая должна возвращать те же экземпляры.
  3. Использование CollectionAssert.AreEqual (IEnumerable, IEnumerable, IComparer) определить отношение равенства вне класса Person. Помните, что тогда вы должны написать тест для IComparer!
0

Спасибо. Я переопределяю метод Equals в Person, и теперь он работает. Я переопределение, как это, может быть, это badway, но вы можете улучшить

public override bool Equals(object objA) 
    { 
    Person person = objA as Person; 
    if (person == null) return false; 
    return (person.FirstName == this.FirstName && person.LastName == this.LastName && person.Language == this.Language && person.PersonId == this.PersonId) 
    } 
Смежные вопросы