试图在NUnit测试类中使用.net Core依赖注入时出错
本文关键字:Core net 依赖 注入 出错 NUnit 测试类 | 更新日期: 2023-09-27 18:12:53
新的单元测试和。net Core(1.0.1),寻找一些帮助。
我正在寻找单元测试几个类使用。net核心依赖注入模式。应用程序运行良好,但是当尝试使用需要DI的类运行NUnit测试时,错误输出:
没有消息TestExecution的处理程序。TestResult'当处于状态时' testexecutionsenttestrunprocessstartinfo '发生异常当调用执行器'executor://dotnetunittestexecutor/v1'时:无法将数据写入传输连接:现有连接为被远端主机强制关闭。现有的连接是被远程主机强制关闭
我没有太多的运气来搜索这个错误,或者任何关于在NUnit中使用DI的文档。我有一种感觉,我不应该这样配置。然而,一些设置(连接字符串等)存在于应用设置中。该文件通过Startup.cs注入。如何在NUnit类中访问这些呢?
My Startup.cs,获取连接字符串并准备DI
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>();
}
MyDAL需要注入配置,通过Startup.cs:
public class MyDAL : IMyDAL
{
private readonly string _dbConnectionString;
public MyDAL(IOptions<ConnectionStrings> connectionString)
{
_dbConnectionString = connectionString.Value.ConnectionString;
}
public bool DoDALStuff() { ... }
}
MyBLL类需要注入IMyDAL:
public class MyBLL
{
public readonly IMyDAL _myDAL;
public MyBLL(IMyDAL myDAL)
{
_myDAL = myDAL;
}
public bool DoBLLStuff() { ... }
}
我的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]
public class BLLTest {
private MyBLL _myBLL;
public BLLTest() {
//Arrange
var dalMock = new Mock<IMyDAL>();
dalMock.Setup(x => x.DoDALStuff()).Returns(true);//setup expected behavior
//...setup other expected behavior of dependencies
//create the target of unit test (class under test)
_myBLL = new MyBLL(dalMock.Object); //manually injecting dependency
}
[Test]
public void TestTheBLL() {
//Act
var result = _myBLL.DoBLLStuff();
//Assert
Assert.IsTrue(result);
}
}
这只是一个入门的基本示例。还有许多其他方法可以做到这一点。你应该对单元测试做更多的研究
我正在使用xUnit,我还没有时间深入研究Nunit。
警告(源)
dotnet-test-nunit仍然是alpha版本
我相信你的试车员有问题。您应该从阅读有关ASP集成测试的内容开始。净的核心。示例只使用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);
在这个例子中,endpoint
是这个URL form
是MultipartFormDataContent
因为我要发布一个文件