试图在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对象放入我的测试类中使用吗?我是否使用了错误的方法?

试图在NUnit测试类中使用.net Core依赖注入时出错

我是否使用了错误的方法?

是的。您误解了单元测试的定义。您希望单独测试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 formMultipartFormDataContent因为我要发布一个文件