Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 创建TestServer并使用XUnit和ASP.NET Core 1.0的依赖项注入_C#_Asp.net_Asp.net Core_Xunit_Asp.net Core 1.0 - Fatal编程技术网

C# 创建TestServer并使用XUnit和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(

我有一个具有以下项目结构的ASP.NET Core 1.0解决方案:

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";
    }
}