【问题标题】:Moq an interface and setting up a mock起订量一个界面并设置一个模拟
【发布时间】:2017-12-13 19:51:47
【问题描述】:

我有一个接口来检查元音并返回一个字符

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

以及使用此 VowChecker 的服务

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'作为结果。任何人都可以帮我解决我错过这个概念的地方。谢谢。

【问题讨论】:

    标签: unit-testing asp.net-core-mvc moq xunit.net


    【解决方案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);
    
    }
    

    【讨论】:

    • 谢谢。它对我有用。你能给我解释一个场景吗?如果我想将学生的卷号作为参数,并且我需要返回该学生对象。我怎样才能做到这一点?我应该使用 service.Setup(i=>i.GetStudentById(id)).Returns((StudentDetails)ob);
    • 您需要设置学生列表和按 ID 查找学生的功能。我将编辑答案,以便展示总体思路。
    • 我已经编辑了这个问题。我遵循了您的程序,但方式有所不同。我现在面临设置模拟的问题。
    • 什么问题?查看更新的问题,没有提到GetStudentById()
    • 我在设置模拟服务时遇到问题。Setup(i=>i.GetStudentById(n)).Returns(?)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-06
    • 2010-09-14
    • 1970-01-01
    • 2019-07-15
    相关资源
    最近更新 更多