2017-07-10 4 views
1

Einrichtung Ich habe eine Schnittstelle Vokal zu überprüfen und char alsMoq eine Schnittstelle und ein Mock

public interface IVowChecker 
{ 
    bool VowCheck(char a); 
    char ReturnChar(int n); 
    Student GetStudentById(int n); 
} 

Es ist konkrete Klasse Umsetzung

public class VowChecker:IVowChecker 
{ 
    public bool VowCheck(char a) 
    { 
     if (a == 'a' || a == 'A') 
      return true; 
     return false; 
    } 
    public char ReturnChar(int n) 
    { 
     return (char)n; 
    } 
    public Student GetStudentById(int n) 
    { 
     var list = new [] 
     { 
      new Student{RollNo=1,Name="A"}, 
      new Student{RollNo=2,Name="B"}, 
      new Student{RollNo=3,Name="C"}, 
      new Student{RollNo=4,Name="D"}, 
      new Student{RollNo=5,Name="E"}, 
      new Student{RollNo=6,Name="F"}, 
     }; 

     var student = from i in list 
         where i.RollNo == n 
         select i; 
     return student.FirstOrDefault(); 
    } 
} 

Und ein Service mit diesen VowChecker

zurückzukehren
public class MyCharService 
{ 
    private readonly IVowChecker _checker; 

    public MyCharService(IVowChecker checker) 
    { 
     _checker = checker; 
    } 
    public bool CheckInput(char a) 
    { 
     return _checker.VowCheck(a); 
    } 
    public char ReturnChar(int a) 
    { 
     return _checker.ReturnChar(a); 
    } 
    public Student GetStudentById(int n) 
    { 
     return _checker.GetStudentById(n); 
    } 
} 

Ich verwende Xunit Testrahmenwerk für Komponententests und Moq Bibliothek. My Unit-Test-Code ist

public class MyCharServiceShould 
{ 
    ... 

    [Theory] 
    [InlineData(65)] 
    [InlineData(68)] 
    public void BeAbleToReturnChar(int n) 
    { 
     var service = new Mock<IVowChecker>(); 

     service.Setup(i => i.ReturnChar(n)).Returns('A'); 
     var obj = new MyCharService(service.Object); 
     var result = obj.ReturnChar(n); 

    } 
    [Theory] 
    [InlineData(2)] 
    public void BeAbleToRetrieveStudent(int n) 
    { 
     var service = new Mock<IVowChecker>(); 
     service.Setup<Student>(i => i.GetStudentById(n)).Returns<Student>(f => (Student)f); 
     var ob = new MyCharService(service.Object); 
     var res = ob.GetStudentById(2); 
     Assert.Equal(res.Name, "B"); 
    } 
} 

Mein Student-Klasse

public class Student 
{ 
    public int RollNo{ get; set; } 
    public string Name { get; set; } 
} 

ich einen Debugger in der letzten Zeile von meinem Test benutzt haben und überprüft die Werte der beiden Tests. Für den ersten Test erwarte ich 'A' als Ergebnis und für den 2. Test erwarte ich 'D' als Ergebnis. Aber in beiden Fällen bekomme ich "A" als Ergebnis. Kann mir jemand helfen, wo ich das Konzept verpasse? Vielen Dank.

Antwort

1

Das Problem ist, dass die Einrichtung für ReturnChar

service.Setup(i => i.ReturnChar(n)).Returns('A'); 

sagt

Whenever ReturnChar() is called, give an answer of 'A' 

Sie ignoriert die Eingabe 'n' und gerade zurück 'A'. Wenn Sie möchten, dass für jeden Test ein anderes Zeichen zurückgegeben wird, müssen Sie das Setup optimieren.

Vielleicht

mockService.Setup(mk => mk.ReturnChar(It.IsAny<int>())).Returns<int>(n => (char)n); 

EDIT: Erweiterung der Rückkehr Objekte zu zeigen (und feste Syntax auf vorherige Antwort)

public class Student 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

public interface IService 
{ 
    Student FindStudentById(int id); 
} 

[TestMethod] 
public void FindStudents() 
{ 
    var students = new[] 
    { 
     new Student {Id = 1, Name = "Mon" }, 
     new Student {Id = 2, Name = "Tue" }, 
     new Student {Id = 3, Name = "Wed" }, 
     new Student {Id = 4, Name = "Thu" }, 
    }; 

    var mockService = new Mock<IService>(); 
    mockService.Setup(mk => mk.FindStudentById(It.IsAny<int>())).Returns<int>(id => students.First(s => s.Id == id)); 

    Assert.AreEqual("Wed", mockService.Object.FindStudentById(3).Name); 

} 
+0

Dank. Es hat für mich funktioniert. Könnten Sie mir bitte ein Szenario erklären? Wenn ich die Rolle des Schülers als Argument nehmen möchte, muss ich dieses Schülerobjekt zurückgeben. Wie kann ich das erreichen? Soll ich service.Setup verwenden (i => i.GetStudentById (id)). Rückgabe ((StudentDetails)); –

+0

müssen Sie eine Liste von Studenten und eine Funktion einrichten, um den Schüler per ID zu finden. Ich werde die Antwort bearbeiten, um die allgemeine Idee zu zeigen. – AlanT

+0

Ich habe die Frage bearbeitet. Ich folgte Ihrer Vorgehensweise, aber auf eine etwas andere Art und Weise. Ich stehe jetzt vor Problemen beim Einrichten des Mocks. –

Verwandte Themen