C# 尝试将.NET核心依赖项注入与NUnit测试类一起使用时出错

C# 尝试将.NET核心依赖项注入与NUnit测试类一起使用时出错,c#,asp.net-core,nunit,asp.net-core-mvc,C#,Asp.net Core,Nunit,Asp.net Core Mvc,在单元测试和.NETCore(1.0.1)中有新功能,正在寻求帮助 我想对几个使用.NET核心依赖注入模式的类进行单元测试。应用程序运行正常,但当尝试使用需要DI的类运行NUnit测试时,错误输出: 处于状态时,没有消息“TestExecution.TestResult”的处理程序 “TestExecutionEntTestRunnerProcessStartInfo”发生异常 在调用执行者的executor://dotnetunittestexecutor/v1“:无法 要将数据写入传输连接:

在单元测试和.NETCore(1.0.1)中有新功能,正在寻求帮助

我想对几个使用.NET核心依赖注入模式的类进行单元测试。应用程序运行正常,但当尝试使用需要DI的类运行NUnit测试时,错误输出:

处于状态时,没有消息“TestExecution.TestResult”的处理程序 “TestExecutionEntTestRunnerProcessStartInfo”发生异常 在调用执行者的executor://dotnetunittestexecutor/v1“:无法 要将数据写入传输连接:已创建现有连接 由远程主机强制关闭。一个现有的连接被删除 被远程主机强制关闭

在搜索该错误或任何与NUnit一起使用DI相关的文档方面没有太多运气。我有一种感觉,我不应该这样配置。但是,appsettings.json文件中存在一些设置(连接字符串等),这些设置通过Startup.cs注入。我如何在NUnit类中访问这些

My Startup.cs,获取DI的连接字符串和preps

public void ConfigureServices(IServiceCollection services)
{
    //other Configurations happen here

    //get the connection string values from appsettings.json
    services.Configure<ConnectionStrings>(Configuration.GetSection("ConnectionStrings"));

    //Classes that get DI'd
    services.AddSingleton<IMyDAL, MyDal>();
    services.AddSingleton<MyBLL>();
}
我的NUnit类需要BLL注入来测试:

[TestFixture]
public class BLLTest
{
    public MyBLL _myBLL;

    public BLLTest(MyBLL myBLL)
    {
        _myBLL = myBLL;
    }

    [Test]
    public void TestTheBLL()
    {
        Assert.IsTrue(_myBLL.DoBLLStuff() == true)
    }
}
这就是我的常规程序流的样子,但我可能以错误的方式尝试以相同的DI方式实现这个单元测试。如果我删除测试类中的任何DI/构造函数代码,测试可以正常运行,但是我仍然需要测试BLL中需要DI的方法。有人知道如何将DI对象放入测试类中使用吗?我是否使用了错误的方法

我是否使用了错误的方法

对。您误解了单元测试的定义。您想单独测试BLL。不是针对实际实现,因为这将是一个集成测试

如何将DI对象放入测试类中使用

您可以创建依赖项的伪实现,或者使用您选择的模拟框架来模拟单元测试的依赖项

[TestFixture]
公共类BLLTest{
私有MyBLL_MyBLL;
公共BLLTest(){
//安排
var dalMock=new Mock();
dalMock.Setup(x=>x.DoDALStuff())。返回(true);//安装程序预期的行为
//…设置依赖项的其他预期行为
//创建单元测试的目标(测试中的类)
_myBLL=newmybll(dalMock.Object);//手动注入依赖项
}
[测试]
public void TestTheBLL(){
//表演
var result=_myBLL.doblstuff();
//断言
断言(结果);
}
}

这只是一个让您开始学习的基本示例。还有很多其他方法可以做到这一点。您应该对单元测试做更多的研究

我正在使用xUnit,我还没有时间深入研究它

警告()

dotnettestnunit仍然是alpha版本

我相信你对你的试跑者有意见。你应该先读一读。但示例仅限于xUnit

下面还介绍了如何使用Nunit执行此操作

重要的是运行测试项目,而不是直接运行web项目(即使测试项目引用和使用了此项目)

因此,您需要在测试项目中使用另一个JSON设置文件,而不是web项目中的文件。您当然希望在测试模式下进行其他配置,而不是在Dev或Prod中

如果是单元测试,您更愿意直接调用类的方法,但是如果您处于集成测试的环境中,您应该像任何其他客户端(JavaScript、移动应用程序等)一样调用控制器

为此,您可以先创建TestServer,然后从中创建一个客户机,最后发送正常的HTTP请求,如下所示:

var webHostBuilder = new WebHostBuilder().UseEnvironment("Testing").UseStartup<Startup>();
var host = new TestServer(webHostBuilder);
var client = host.CreateClient();
var response = await client.PostAsync(endpoint, form);
var webHostBuilder=new webHostBuilder().UseEnvironment(“测试”).UseStartup();
var host=newtestserver(webHostBuilder);
var client=host.CreateClient();
var response=wait client.PostAsync(端点,表单);

在这个例子中,
endpoint
就是这个URL,
form
是一个
MultipartFormDataContent
,因为我发布了一个文件

迟来的答案,但我最终还是按照你说的那样进行了模拟。我可能误解了单元测试框架中的依赖注入功能。非常感谢。
[TestFixture]
public class BLLTest
{
    public MyBLL _myBLL;

    public BLLTest(MyBLL myBLL)
    {
        _myBLL = myBLL;
    }

    [Test]
    public void TestTheBLL()
    {
        Assert.IsTrue(_myBLL.DoBLLStuff() == true)
    }
}
var webHostBuilder = new WebHostBuilder().UseEnvironment("Testing").UseStartup<Startup>();
var host = new TestServer(webHostBuilder);
var client = host.CreateClient();
var response = await client.PostAsync(endpoint, form);