读取测试项目中的Appsettings

问题描述 投票:0回答:1

我有一个测试方法,在执行时调用类中的一个方法,该方法具有以下行

_configuration.GetValue<string>("Root:Child");

该类已注入

IConfiguration
,因此在正常执行中可以正常工作。

但是执行测试方法时失败

编辑 1:测试类 - 完成

public class MyClassTest
{
 private AutoMocker mock;
 private Mock<IMyClient> client;
 private IMyClass testobj;

 public void Initialize()
 {
     mock = new AutoMocker();
     myRepo = mock.GetMock<IMyRepo>();
     client = mock.GetMock<IMyClient>();
     testobj = mock.CreateInstance<MyClass>();
 }

 public async Task testMethod()
 {
     var result = testobj.MyUnitTestMethod();
     // Assert
 }

我的班级

public class MyClass:IMyClass
{
 private readonly IMyClient _myClient;
 private readonly IConfiguration _config;
 
 //constructor
 public MyClass(IMyClient myClient, IConfiguration config)
 {
 }
 private async Task<MyEntity> MyMethod()
 {
  //some operation
  _config.GetValue<string>("Root:Child");
  //some operation
 }
}

我试图确保当

MyUnitTestMethod
被调用时,以及在流程中,当它到达具有读取 appsettings 值(Root :Child)行的
MyClass
方法时,应该获取该值,并且不会出现错误。

我尝试在根测试项目中添加新的配置 json,并按照 Core xUnit 测试项目中的配置:找不到配置文件“appsettings.test.json”

c# unit-testing mocking .net-6.0 appsettings
1个回答
0
投票

不建议从磁盘读取 .json 文件进行单元测试。最佳实践是在单元测试期间避免对网络和磁盘 I/O 的任何类型的依赖。

相反,您应该模拟这些依赖项。您可以使用

Moq
来模拟 IConfiguration。看起来你已经尝试过了,但我认为你的构造函数中缺少一个语句 - 你接受了两个参数,但你没有使用它们

 //constructor
 public MyClass(IMyClient myClient, IConfiguration config)
 {
 }

这是一个小型的、有效的类实现,它依赖于 IConfiguration,并通过模拟传递单元测试。

using Microsoft.Extensions.Configuration;
using Moq;

namespace TestProject2
{
    public class MyClass
    {
        private readonly IConfiguration _config;

        public MyClass(IConfiguration config)
        {
            _config = config;
        }

        public string Foo()
        {
            return _config.GetValue<string>("Root:Child");
        }
    }

    public class UnitTest1
    {
        [Fact]
        public void Test1()
        {
            Mock<IConfigurationSection> mockSection = new Mock<IConfigurationSection>();
            mockSection.Setup(x => x.Value).Returns("from-unit-test");

            Mock<IConfiguration> mockConfig = new Mock<IConfiguration>();
            mockConfig.Setup(x => x.GetSection("Root:Child")).Returns(mockSection.Object);

            var underTest = new MyClass(mockConfig.Object);
            Assert.Equal("from-unit-test", underTest.Foo());
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.