我有一个测试方法,在执行时调用类中的一个方法,该方法具有以下行
_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”
不建议从磁盘读取 .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());
}
}
}