C# 创建TestServer并使用XUnit和ASP.NET Core 1.0的依赖项注入
我有一个具有以下项目结构的ASP.NET Core 1.0解决方案:C# 创建TestServer并使用XUnit和ASP.NET Core 1.0的依赖项注入,c#,asp.net,asp.net-core,xunit,asp.net-core-1.0,C#,Asp.net,Asp.net Core,Xunit,Asp.net Core 1.0,我有一个具有以下项目结构的ASP.NET Core 1.0解决方案: public class DatabaseFixture : IDisposable { public ICustomerService CustomerService; public DatabaseFixture(ICustomerService service) { CustomerService = service; } public void Dispose(
public class DatabaseFixture : IDisposable
{
public ICustomerService CustomerService;
public DatabaseFixture(ICustomerService service)
{
CustomerService = service;
}
public void Dispose()
{
}
}
Web应用程序(ASP.NET MVC6)BusinessLibrary(类库包)
数据库(类库包)
测试(类库包w/) 我试图在整个系统中使用微软新的内置依赖注入 以下是当前所有内容如何从我的ASP.NET MVC应用程序一直流到我的存储库层
//Startup.cs of MVC Web App
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddMvc();
services.AddSingleton(_=> Configuration);
services.AddTransient<ICustomerService, CustomerService>();
services.AddTransient<ICustomerRepository, CustomerRepository>();
}
public class CustomersController : Controller
{
private ICustomerService _service;
public CustomersController(ICustomerService service)
{
_service= service;
}
}
public class CustomerService : ICustomerService
{
private ICustomerRepository _repository;
public PriceProtectionManager(ICustomerRepository repository)
{
_repository = repository;
}
}
public class CustomerRepository : BaseRepository, ICustomerRepository
{
public CustomerRepository(IConfigurationRoot config)
: base(config)
{
}
}
public class BaseRepository
{
private IConfigurationRoot _config;
public BaseRepository(IConfigurationRoot config)
{
_config = config;
}
}
问题是ICCustomerService无法解决。。。这可能是因为我没有像我的WebApp那样的Startup.cs。如何在测试项目中复制这种行为?我不知道在哪里创建我的TestServer,因为如果我在fixture中这样做,那就太晚了。好吧,你可以为你的SUT提供你自己的依赖项(这是你想要的方式)。我刚刚回答了一个类似的问题 如果您想在一个地方定义connectionstring,可以使用xUnit的能力来使用(fixture) 更新:操作夹具和设备的示例 testclass应实现IClassFixture,并包含以下字段和构造函数:
public class AspnetCoreAndXUnitPrimeShould: IClassFixture<CompositionRootFixture>
{
private readonly TestServer _server;
private readonly HttpClient _client;
private readonly CompositionRootFixture _fixture;
public AspnetCoreAndXUnitPrimeShould(CompositionRootFixture fixture)
{
// Arrange
_fixture = fixture;
_server = new TestServer(TestServer.CreateBuilder(null, app =>
{
app.UsePrimeCheckerMiddleware();
},
services =>
{
services.AddSingleton<IPrimeService, NegativePrimeService>();
services.AddSingleton<IPrimeCheckerOptions>(_ => new AlternativePrimeCheckerOptions(_fixture.Path));
}));
_client = _server.CreateClient();
}
这只是对另一个示例的快速采用,但您应该了解现在如何解决问题。AlternativePrimeCheckerOptions在构造函数中接受一个字符串,就像您的配置类一样。用一个固定装置,你把这个连接串安排在一个地方
更新
示例:为什么不使用ASP.NET附带的?这允许您只需插入一个
IOptions
@DannyvanderKraan请查看我在您其他帖子上的评论。此外,请参阅我对当前代码的更新。@HenkMollema您能详细说明一下吗?请查看我的更新帖子,了解我的MVC应用程序目前如何使用DI深入到存储库层。@DannyvanderKraan很抱歉再次打扰您,但您是否可以查看我的编辑,了解所有内容如何从我的MVC web应用程序深入到存储库层,以及我当前的fixture类是什么样子。fixture基本上相当于我的asp.net mvc应用程序中的控制器。我认为我们的思路是正确的,但是我可以得到一个合并fixture和DI的示例吗?Danny非常感谢您提供这个示例。我不知道你是否注意到了,但我是另一个帖子里的同一个人。可能不该打开两个。您是否有可能在github上加载一个示例,向我展示:如果我有“ipProductRepo”和“ProductRepo”,我如何使用DI访问测试类中的ProductRepo实例?在这里发布之前,我尝试使用Xunit共享上下文文档和ASP.NETCore1.0集成测试文档的组合。我只是简单地做一些事情,比如:private IProductRepo\u productRepo=new productRepo();在我的测试类的顶部,但诀窍是我的ProductRepo要求注入IConfigurationRoot,因为我将其用于连接字符串。Blake,是的,我后来注意到了。答案几乎是一样的。首先,只需将IConfigurationRoot添加到TestServer的服务中。然后让ProductRepo通过其构造函数请求IConfigurationRoot的实例,并将其添加到TestServer的同一服务集合中。底层依赖项注入容器将处理依赖项的注入。就固定装置而言,我注入了一个“路径”,您可以注入一个“connectionstring”或其他类似的方式。有关示例,请参阅更新。我没有UsePrimeCheckerMiddle软件。。在CompositionRootFixture类中,intellisense在ContainerBuilder、RegisterInstance和Resolve上出错。这些是自动传真机吗?因为我没有使用AutoFac。我不应该向TestServer传递一个来自我的测试项目的Startup.cs文件,就像上面的例子一样吗?我只是不明白DI是如何从ASP.NET应用程序一直顺利地工作到我的存储库的,让它从我的单元测试流到存储库是如此的不同。
public class CompositionRootFixture
{
public string Path { get; }
public CompositionRootFixture()
{
Path = "@/checkprime";
}
}