我正在使用XUnit,在运行测试服之前需要执行一些操作。因此,我尝试使用IClassFixture特性的XUnit。但是我找不到一种方法将依赖项注入到治具类中。我的代码结构如下:
public class MyFixture
{
IDependency _dep;
public MyFixture(IDependency dep)
{
_dep = dep;
}
void DoSomeJob()
{
//// some code there
dep.DoSome();
}
} 这是我的测试类代码:
public class MyTest : IClassFixture<MyFixture>
{
[Fact]
public void test_my_code()
{
////simply just test the code
}
}但是当我运行测试时,我得到了异常
Xunit.Sdk.TestClassException类夹具类型'MyFixture‘有一个或多个未解析的构造函数
发布于 2021-10-04 11:38:24
您的夹具类依赖于尚未配置的IDependency dep。您可以使用治具类来设置服务提供者;但是,它不是最好的解决方案,因为您必须使用服务定位器模式,如
serviceProvider.GetRequiredService<T>()建议使用xunit.di,它是一个内置在xunit框架中的扩展,以支持构造函数依赖注入,使我们能够在测试类和它们的依赖项之间实现控制反转(IoC)。
Install-Package Xunit.Di使用:xunit.di:
从xunit.di入门找到完整的说明和演示
您的测试项目有以下内容:
您的Setup.cs类如下所示:
private IServiceProvider _services;
private bool _built = false;
private readonly IHostBuilder _defaultBuilder;
public Setup()
{
_defaultBuilder = Host.CreateDefaultBuilder();
}
public IServiceProvider Services => _services ?? Build();
private IServiceProvider Build()
{
if (_built)
throw new InvalidOperationException("Build can only be called once.");
_built = true;
_defaultBuilder.ConfigureServices((context, services) =>
{
services.AddSingleton<TextReaderService>();
services.AddSingleton<IDependency, DependencyImpl>();
// where DependencyImpl implements IDependency
// ... add other services needed
});
_services = _defaultBuilder.Build().Services;
return _services;
}然后您的测试类如下所示:
public class MyTest
{
private readonly IDependency _dependency;
public MyTest(IDependency dependency)
{
_dependency = dependency;
}
[Fact]
public void test_my_code()
{
var result = _dependency.DoStuff();
Assert.NotNull(result);
////simply just test the code
}
}https://stackoverflow.com/questions/67556254
复制相似问题