关于c#:如何对ASP.NET核心Web应用程序(.Net Framework)进行单元测试?

How do you unit test ASP.NET Core Web Application (.Net Framework)?

我正在构建一个ASP.NET核心Web应用程序(.NET框架),很难弄清楚如何将单元测试与之挂钩。我的目标是.NET框架版本4.6.1

如果我创建一个针对4.6.1的常规"类库"项目,就像以前版本的MVC一样,它允许我添加对我的MVC项目的引用(这是同一解决方案的一部分),但是我通过using语句添加的任何名称空间都会报告一个错误,我可能缺少引用或using语句。如果我双击解决方案资源管理器中"引用"部分下的引用,它会告诉我该项目找不到或尚未生成。

我尝试创建一个"类库(.NET核心)",但这会引起抱怨,因为我的目标是.NET框架而不是.NET核心。我编辑了libaries project.json类,使它以.NET框架为目标,这样我就可以添加引用,并且当我在using语句中使用命名空间时不会抱怨,但是测试运行程序没有发现任何测试。我试过许妮和努尼特,他们的行为都一样。

是否可以对面向.NET Framework 4.6.1的ASP.NET核心Web应用程序进行单元测试,或者是否需要提交到.NET核心?

编辑以添加我的测试类这是我的测试课,精简到最低限度。testbank.services是我要测试的类。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
using System;
using TestBank.Services;
using Xunit;

namespace TestBankUnitTests
    {    
    public class Class1
    {        
        [Fact]
        public void TestA()
        {
            Assert.True(false);
        }
    }
}

这是我的项目.json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
   "version":"1.0.0-*",

   "dependencies": {
       "xunit":"2.1.0",
       "dotnet-test-xunit":"1.0.0-rc2-build10025",
       "TestBank":"1.0.0-*"
    },

   "frameworks": {
       "net461": {
        }
    }
}


您的project.json需要testRunner设置。根据project.json文档,testRunner设置不仅指定要使用的测试框架,还将项目标记为测试项目。

尝试添加它并查看它是否找到您的测试(在本地验证,如果文件中没有此设置,它将找不到测试)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
   "version":"1.0.0-*",

   "dependencies": {
       "xunit":"2.1.0",
       "dotnet-test-xunit":"1.0.0-rc2-build10025",
       "TestBank":"1.0.0-*"
    },

   "frameworks": {
       "net461": {
        }
    },

  "testRunner":"xunit"
}


我找到了对我有用的东西。在我的测试项目中,我的project.json文件如下所示:

2

"ng2a.web api"是我的web api核心项目。它只针对net452。ng2a.webapi project.json文件如下:

1
2
"frameworks": {
"net452": {}

}


我也遇到了类似的问题,找到了解决办法。我把它贴在这里,以防它能帮助别人。我学到的是,使用以net461为目标的xproj库来测试以net461为目标的ASP.NET核心项目(.NET框架)项目和以框架4.61为目标的Windows类库可以工作,但安装程序似乎非常脆弱。我的关键见解来自于这个线程https://github.com/aspnet/tooling/issues/245,其中@bradrem指出项目的文件夹结构似乎是问题的根源。

最初我尝试使用此文件夹结构失败:

SRC__面向Net461的ASP.NET核心项目(.NET框架)项目__ Windows类库目标框架4.61

测试__用于运行XUnit测试的核心库

但是当我尝试使用这个文件夹结构运行测试时,它产生了一个异常,开始时是这样的:

1
2
3
4
5
6
7
8
9
10
11
Unable to start C:\Program Files\dotnet\dotnet.exe
dotnet-test Error: 0 : [ReportingChannel]: Waiting for message failed System.IO.IOException: Unable to read data from the transport connection: An established connection was aborted by the software in your host machine. ---> System.Net.Sockets.SocketException: An established connection was aborted by the software in your host machine
   at System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags)
   at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
   --- End of inner exception stack trace ---
   at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
   at System.IO.Stream.ReadByte()
   at System.IO.BinaryReader.ReadByte()
   at System.IO.BinaryReader.Read7BitEncodedInt()
   at System.IO.BinaryReader.ReadString()
   at Microsoft.DotNet.Tools.Test.ReportingChannel.ReadMessages()

但当我更改为以下文件夹结构时,我可以使其正常工作:

SRC__面向Net461的ASP.NET核心项目(.NET框架)项目__ Windows类库目标框架4.61__用于运行XUnit测试的核心库所以关键是将测试类库所在的文件夹放在其他项目文件夹所在的SRC文件夹中。

也就是说,另一件看起来有很大区别的事情是同时将对其他两个项目的引用添加到核心库测试项目中,而不是一次添加一个。