如何对ASP.NET Core Web应用程序(.Net Framework)进行单元测试?

6
我正在构建一个ASP.NET Core Web应用程序(.Net Framework),但是我很难弄清楚如何将单元测试连接起来。我正在针对.NET Framework版本4.6.1进行定位。
如果我创建一个普通的“类库”项目,针对4.6.1版本,就像之前的MVC版本一样,它会允许我添加到我的MVC项目(该项目属于同一解决方案),但是我通过“using”语句添加的任何命名空间都会报告错误,可能缺少引用或使用语句。如果我在解决方案浏览器中的“引用”部分下双击引用,则会告诉我找不到项目或尚未构建该项目。
我尝试创建一个“类库(.NET Core)”,但这会报错,因为我是针对.NET Framework而不是.NET Core。我编辑了类库的Project.json文件,将其定位到.NET Framework,这样可以让我添加引用,并且当我在“using”语句中使用命名空间时不会出错,但是我的所有测试都没有被测试运行器发现。我尝试了XUnit和NUnit,它们的行为都相同。
能否针对定位到.NET Framework 4.6.1的ASP.NET Core Web应用程序进行单元测试,还是需要采用.NET Core?
编辑以添加我的测试类 这是我的测试类,裁剪至最低限度。我要测试的类是TestBank.Services。
using System;
using TestBank.Services;
using Xunit;

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

这是我的 project.json 文件:

{
    "version": "1.0.0-*",

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

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

单元测试发现相当挑剔。 我发现我必须拥有仅包含.NET Core项目的解决方案,否则它就无法找到测试。例如,我有一个.Core Core MVC应用程序和一个.Core库与我的测试,还有第三个项目只是一个类库(不是.NET Core)。由于某种原因,VS无法发现测试,直到我从解决方案中删除了那个非核心库。 - stephen.vakil
目前我的解决方案仅包含MVC项目和.NET Core类库(修改为目标.NET Framework 4.6.1),它无法发现测试。这让我想知道测试发现是否只适用于真正的.NET Core,而不是针对.NET Framework的.NET Core。 - Andre Messier
不应该有问题。这也是我在我的解决方案中所做的。你能发布你的测试类吗?它们是公共类,带有Fact或等效标记的公共方法,对吧? - stephen.vakil
是的,类和方法都是公共的。我使用了我的极简测试类更新了原问题。 - Andre Messier
你能同时发布你的project.json吗?当使用xunit时,你是否在其中包含了xunit测试运行器?它是否可以从命令行(dotnet test)中正常工作? - stephen.vakil
我在原贴中发布了我的project.json。如果我理解正确,xunit测试运行器是dotnet-test-xunit,并且已经包含在project.json中。从命令窗口执行dotnet test返回的是Command "dotnet" is not valid.这看起来并不乐观。 - Andre Messier
3个回答

8
你的 project.json 需要一个 testRunner 设置。根据 project.json 文档testRunner 设置不仅指定要使用哪个测试框架,还将项目标记为测试项目。
尝试添加它并查看是否找到您的测试(本地验证,如果文件中没有此设置,则不会找到测试)。
{
    "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"
}

做到了。现在我感到很傻,因为最初错过了那个!谢谢! - Andre Messier

0
我曾经遇到过类似的问题,并找到了解决方案。我在这里发布它,以防有人需要。我所学到的是,使用针对net461的xproj库来测试针对net461的Asp.Net Core项目(.Net Framework)和针对框架4.61的Windows类库的项目可以工作,但设置似乎非常棘手和脆弱。对我来说,关键的洞察力来自于这个线程https://github.com/aspnet/Tooling/issues/245,@BradRem指出项目的文件夹结构似乎是问题的根源。
最初,我尝试不成功地使用以下文件夹结构:
src
____Asp.Net Core Project (.Net Framework) project targeting Net461
____Windows class library targeting framework 4.61
test
____Core Library used to run xUnit Tests
但当我尝试使用这个文件夹结构运行测试时,它产生了以下异常:
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
____Asp.Net Core项目(.Net Framework),目标为Net461的项目
____针对框架4.61的Windows类库
____用于运行xUnit测试的核心库

因此,关键是将存放测试类库的文件夹放在其他项目文件夹所在的src文件夹中。

话虽如此,另一个似乎起到了很大作用的事情是同时向核心库测试项目添加对其他两个项目的引用,而不是逐个添加。


0
我发现了适合我的东西。
在我的测试项目中,我的project.json文件如下所示:
{
  "version": "1.0.0-*",
  "testRunner": "xunit",

  "dependencies": {
    "xunit": "2.2.0-beta2-build3300",
    "dotnet-test-xunit": "2.2.0-preview2-build1029",   
    "Ng2a.WebApi": "1.0.0-*"
  },

  "frameworks": {
    "net452": {
    }

  }
}

'

Ng2a.WebApi' 是我的 Web API 核心项目。它仅针对 net452。Ng2a.WebApi 项目的 project.json 文件如下:

"frameworks": {
"net452": {}

},


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接