gpt4 book ai didi

c# - 使用 Moq 从另一个方法调用模拟方法

转载 作者:行者123 更新时间:2023-12-03 03:33:31 25 4
gpt4 key购买 nike

我正在尝试使用 MsTest 为以下两种方法创建单元测试。我对此相当陌生,到目前为止已经引用过有关该主题的不同帖子。

代码要求

  1. 创建基于计时器的函数 (Azure)
  2. 按顺序执行方法 1 和方法 2 以获得输出。

测试要求

  • 能够为每个类/方法创建单元测试用例,无需外部依赖(Fake/Mock)
  • 为了适应测试中的此代码,可以更新,因为代码尚未上线。
  • 向 Moq 之外的其他工具/Nuget 开放,以支持测试要求。
  • 当我尝试运行单元测试时,它不会模拟方法 2,而是执行它。我需要调试代码方面的帮助。

     public class Job: IJob
    {
    //Method 1
    public List<TableEntity> GetJob()
    {
    var a = Get<T>("static value"); //Mock this to Test Method GetJob
    return a.Result;
    }

    //Method 2
    public async Task<List<T>> Get<T>(string tableName) where T : ITableEntity, new()
    {
    var t = new List<T>();
    //add data to T
    return t;

    }
    }

    界面

    public interface IJob
    {
    List<TableEntity> GetJob();

    Task<List<T>> Get<T>(string tableName) where T : ITableEntity, new();

    }

    测试代码

        private readonly Mock<IJob> _mockIJob = new Mock<IJob>();
    readonly Job _job = new Job();

    public void NotThrow_Error_When_JobFound()
    {
    //Arrange
    var jobs = new J.TableEntity()
    {
    FolderName = "FolderName",
    Timestamp = DateTimeOffset.Now
    };

    var jobList = Task.FromResult(new List<TableEntity>() { jobs });

    _mockIJob.Setup(c => c.Get<TableEntity>(""))
    .Returns(jobList);

    //Act
    var actualResult = _job.GetJob();

    //Assert
    Assert.AreEqual(jobList, actualResult);

    }

    最佳答案

    我认为在简化代码时,有些东西在翻译中丢失了(例如,var a = Get<T>("static value");不知道 T 在这里指的是什么),但通过小的修改,我认为您将能够实现您正在尝试的目标。

    1. 为了使用模拟,您需要模拟对象实例,因此您需要删除对具体实例的引用:
        private readonly Mock<IJob> _mockIJob = new Mock<IJob>();
    // readonly Job _job = new Job(); // This should not be used.
  • 为了将具体方法 1 与模拟方法 2 一起使用,您需要模拟 Job 具体类。
  • private readonly Mock<Job> _mockJob = new Mock<Job>();
  • 为了让代理类“接管”一个方法,应该将其声明为 virtual:
  • //Method 2
    public virtual List<T> Get<T>(string tableName) where T : TableEntity, new()
    {
    var t = new List<T>();
    //add data to T
    return t;

    }
  • 在模拟该方法时,您应该使用 It.IsAny<string>()规范,否则您的测试方法正在使用 "" 的模拟参数,而 method1 使用 "static value"参数,所以不会匹配代理方法。
  • 所以把这些放在一起:

    private readonly Mock<Job> _mockJob = new Mock<Job>();

    [Fact]
    public void NotThrow_Error_When_JobFound()
    {
    //Arrange
    var jobs = new TableEntity()
    {
    FolderName = "FolderName",
    Timestamp = DateTimeOffset.Now
    };

    var jobList = new List<TableEntity>() { jobs };

    _mockJob.Setup(c =>
    c.Get<TableEntity>(It.IsAny<string>()))
    .Returns(() =>
    {
    // easier to visualize the breakpoint.
    return jobList;
    });

    //Act
    var actualResult = _mockJob.Object.GetJob();

    //Assert
    Assert.Equal(jobList, actualResult);
    }

    希望有帮助。

    关于c# - 使用 Moq 从另一个方法调用模拟方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74159688/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com