Unit testing Moq接口和设置模拟
我有一个检查元音和返回字符的接口Unit testing Moq接口和设置模拟,unit-testing,asp.net-core-mvc,moq,xunit.net,Unit Testing,Asp.net Core Mvc,Moq,Xunit.net,我有一个检查元音和返回字符的接口 public interface IVowChecker { bool VowCheck(char a); char ReturnChar(int n); Student GetStudentById(int n); } 它是具体的类实现 public class VowChecker:IVowChecker { public bool VowCheck(char a) { if (a == 'a' ||
public interface IVowChecker
{
bool VowCheck(char a);
char ReturnChar(int n);
Student GetStudentById(int n);
}
它是具体的类实现
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");
}
}
我在测试的最后一行使用了调试器,并检查了两个测试的值。对于第一次测试,我期望结果为“A”,对于第二次测试,我期望结果为“D”。但在这两种情况下,我的成绩都是“A”。谁能帮我解决一下我遗漏了什么概念。谢谢。问题是
ReturnChar
service.Setup(i => i.ReturnChar(n)).Returns('A');
说,
它忽略输入“n”,只返回“A”。如果希望它为每个测试返回不同的字符,则需要调整设置
或许
mockService.Setup(mk => mk.ReturnChar(It.IsAny<int>())).Returns<int>(n => (char)n);
mockService.Setup(mk=>mk.ReturnChar(It.IsAny()).Returns(n=>(char)n);
编辑:显示返回对象的扩展名(和上一个答案中的固定语法)
公共班级学生
{
公共int Id{get;set;}
公共字符串名称{get;set;}
}
公共接口设备
{
学生查找学生id(int id);
}
[测试方法]
公共无效查找学生()
{
var学生=新[]
{
新学生{Id=1,Name=“Mon”},
新学生{Id=2,Name=“Tue”},
新学生{Id=3,Name=“Wed”},
新学生{Id=4,Name=“Thu”},
};
var mockService=new Mock();
mockService.Setup(mk=>mk.FindStudentById(It.IsAny()).Returns(id=>students.First(s=>s.id==id));
AreEqual(“Wed”,mockService.Object.FindStudentById(3.Name);
}
谢谢。这对我有用。你能给我解释一个场景吗。若我想把学生的卷号作为参数,我需要得到要返回的学生对象。我怎样才能做到这一点?我应该使用service.Setup(I=>I.GetStudentById(id)).Returns((StudentDetails)ob);您需要设置一个学生列表和一个函数“按Id查找学生”。我将编辑答案,以显示总体思路。我已编辑了问题。我遵循了你的程序,但方式有点不同。我现在面临设置模拟的问题。什么问题?查看更新后的问题,没有参考GetStudentById()
I在设置模拟服务时面临的问题。设置(I=>I.GetStudentById(n))。返回(?)
Whenever ReturnChar() is called, give an answer of '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);
}