提问人:TrialByFire 提问时间:11/14/2023 最后编辑:LuckyTrialByFire 更新时间:11/20/2023 访问量:69
读取测试项目中的 Appsettings
Read Appsettings in test project
问:
我有一个测试方法,在执行时调用类中的一个方法,该方法具有以下行
_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
}
}
我试图确保何时调用以及当它到达具有读取 appsettings 值(Root :Child)行的方法时,在流中应该获取该值并且不会出错。MyUnitTestMethod
MyClass
我尝试在根测试项目中添加新的配置 json 并按照 Core xUnit 测试项目中的配置进行操作:找不到配置文件“appsettings.test.json”
答:
0赞
Jocke
11/16/2023
#1
不建议从磁盘读取 .json 文件以进行单元测试。最佳做法是在单元测试期间避免通过网络和磁盘 I/O 建立任何类型的依赖关系。
相反,你应该模拟这些依赖项。可用于模拟 IConfiguration。看起来你已经尝试过了,但我认为你的构造函数中缺少一个语句 - 你接受两个参数,但你没有使用它们Moq
//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());
}
}
}
0赞
Lucky
11/20/2023
#2
同意 Jocke 关于构造函数有两个未使用的参数,我假设您错过了或认为它不是很相关。
但这是对我有用的东西,我正在更新你的例子:
public class MyClassTest
{
private AutoMocker mock;
private Mock<IMyClient> client;
private IMyClass testobj;
private Mock<IConfiguration> config;
public void Initialize()
{
mock = new AutoMocker();
myRepo = mock.GetMock<IMyRepo>();
client = mock.GetMock<IMyClient>();
config = mocker.GetMock<IConfiguration>();
config.Setup(x => x["Root:Child"]).Returns("ValueofChildAppSetting");
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["Root:Child"];
//some operation
}
}
评论