C# 尝试将.NET核心依赖项注入与NUnit测试类一起使用时出错
在单元测试和.NETCore(1.0.1)中有新功能,正在寻求帮助 我想对几个使用.NET核心依赖注入模式的类进行单元测试。应用程序运行正常,但当尝试使用需要DI的类运行NUnit测试时,错误输出: 处于状态时,没有消息“TestExecution.TestResult”的处理程序 “TestExecutionEntTestRunnerProcessStartInfo”发生异常 在调用执行者的executor://dotnetunittestexecutor/v1“:无法 要将数据写入传输连接:已创建现有连接 由远程主机强制关闭。一个现有的连接被删除 被远程主机强制关闭 在搜索该错误或任何与NUnit一起使用DI相关的文档方面没有太多运气。我有一种感觉,我不应该这样配置。但是,appsettings.json文件中存在一些设置(连接字符串等),这些设置通过Startup.cs注入。我如何在NUnit类中访问这些 My Startup.cs,获取DI的连接字符串和prepsC# 尝试将.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“:无法 要将数据写入传输连接:
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);