2016-05-09 4 views
0

ich eine Liste von Objekt haben wie untenIndexOf finden kein Element in einer Liste <> während Mock

public class Person 
{ 
    public string Name {get; set;} 
    public int Age {get; set;} 
} 
public class SomeClass 
{ 
public int DoSomething() 
{ 
    int result; 
    List<Person> personList = new List<Person>(); 
    personList.Add(new Person { //with 1 object, just to keep simple 
     Name = "Someone", 
     Age = 18}); 
    Person eighteenYearsOld = _checkAge.FindEighteenYearsOld (personList); 
    int index = personList.IndexOf (eighteenYearsOld); 
    //do something 
    return result; 
} 
} 
[TestMethod] 
public void DoSomething_Test() 
{ 
    //Given: 

    //When: I call SomeClass object 
    Person eightnneYears = new Person { 
     Name = "Someone", 
     Age = 18}; 
    _mockCheckAge.Setup (x => x.FindEighteenYearsOld(It.IsAny<List<Person>>())).Returns(eightnneYears); 
    _someClass = new SomeClass (_mockCheckAge.Object); 
    int result = _someClass.DoSomething(); 
    //Then: 
} 

Wie ich die FindEighteenYearsOld Methode verspottet haben es gibt ein Person Objekt mit gleichen Staaten, die Geschenke in der personList ist . Aber wenn personList.IndexOf() ausgeführt wird, gibt es den Index -1 zurück, der 0 sein soll. Was soll ich tun.

+3

Ihre 'Person' Klasse überschreibt nicht' Equals', die 'IndexOf' verwendet gleichen Wert zu finden. –

+0

Warum haben Sie eine 'FindEightenYearsOld' Methode anstatt einer' FindByAge (18) '? – user3791372

Antwort

2

List.IndexOf verwendet Equals, um gleiche Objekte zu finden. Wenn Ihre Klasse nicht überschreibt, werden nur Referenzen verglichen. Da Ihre beiden Instanzen nicht identisch sind, gibt List.IndexOf-1 zurück.

So überschreiben Equals (und auch immer GetHashCode dann):

public class Person 
{ 
    public string Name { get; set; } 
    public int Age { get; set; } 

    public override bool Equals (Object obj) 
    { 
     Person otherPerson = obj as Person; 
     return otherPerson != null 
      && otherPerson.Name == Name 
      && otherPerson.Age == Age; 
    } 

    // http://stackoverflow.com/a/263416/284240 
    public override int GetHashCode() 
    { 
     unchecked // Overflow is fine, just wrap 
     { 
      int hash = 17; 
      hash = hash * 23 + (Name?.GetHashCode() ?? 0); // or: hash = hash * 23 + (Name == null ? 0 : Name.GetHashCode()); 
      hash = hash * 23 + Age; ; 
      return hash; 
     } 
    } 
} 
Verwandte Themen