2017-07-10 22 views
1

我有一個接口來檢查元音,並返回一個char作爲起訂量的界面和設置模擬

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

這是使用這個VowChecker

具體類實現

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(); 
    } 
} 

與服務

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

我正在使用Xunit測試框架進行單元測試和Moq庫。 我的單元測試代碼是

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"); 
    } 
} 

我的學生類

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

我在測試的最後一行用一個調試器和檢查的兩個測試值。對於第一次測試,我期待'A'作爲結果,對於第二次測試,我期待'D'作爲結果。但在這兩種情況下,我都會得到'A'。任何人都可以幫助我,我錯過了這個概念。謝謝。

回答

1

的問題是,對於ReturnChar

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

安裝說,

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

它忽略了輸入 'n' 和剛剛返回 'A'。如果你想讓它爲每個測試返回一個不同的字符,你將需要調整設置。

也許

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

編輯:擴展顯示返回對象(和前面的答案固定的語法)

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

感謝。它爲我工作。你能解釋一下我的情況嗎?如果我想把學生的卷號作爲參數,我需要讓那個學生對象返回。我怎樣才能做到這一點?我應該使用service.Setup(i => i.GetStudentById(id))。返回((StudentDetails)ob); –

+0

你需要設置一個學生列表和一個功能,通過ID找到學生。我將編輯答案,以顯示總體思路。 – AlanT

+0

我編輯了這個問題。我遵循你的程序,但以一種不同的方式。我現在正面臨着設置模擬的問題。 –

相關問題