Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing Moq接口和设置模拟_Unit Testing_Asp.net Core Mvc_Moq_Xunit.net - Fatal编程技术网

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

}