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

时间:2016-08-29 15:55:33

标签: c# asp.net .net unit-testing asp.net-core-mvc

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

如果我创建一个普通的"类库"项目目标4.6.1,就像我以前的MVC版本一样,它允许我添加对我的MVC项目的引用(这是同一解决方案的一部分),但我通过using语句添加的任何命名空间都报告错误我可能会错过引用或使用语句。如果我双击"参考文献"下的参考文献。解决方案资源管理器中的部分告诉我项目无法找到或尚未构建。

我尝试创建一个"类库(.NET Core)"但这引起了人们的反对,因为我的目标是.Net Framework而不是.NET Core。我编辑了类库lib.json,使它以.net框架为目标,这让我可以添加我的引用,并且当我在using语句中命名空间时没有抱怨,但是我的测试都没有被发现试验跑步者。我已经尝试了XUnit和NUnit,它们的行为都相同。

是否可以对面向.Net Framework 4.6.1的ASP.Net核心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": {
        }
    }
}

3 个答案:

答案 0 :(得分:8)

您的project.json需要testRunner设置。根据{{​​3}},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"
}

答案 1 :(得分:0)

我遇到了类似的问题并找到了解决方案。我在这里张贴它,以防它帮助某人。我学到的是使用一个针对net461的xproj库来测试针对net461的Asp.Net核心项目(.Net Framework)项目和一个面向框架4.61的Windows类库,但设置似乎非常挑剔和脆弱。对我来说,关键的见解来自于这个线程https://github.com/aspnet/Tooling/issues/245,其中@BradRem表明项目的文件夹结构似乎是问题的根源。

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

SRC
    面向Net461的____Asp.Net核心项目(.Net Framework)项目
    ____Windows类库目标框架4.61

测试
    ____Core Library用于运行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
    面向Net461的____Asp.Net核心项目(.Net Framework)项目
    ____Windows类库目标框架4.61
    ____Core Library用于运行xUnit测试

因此关键是将包含测试类库的文件夹放在src文件夹中,其他项目文件夹位于该文件夹中。

也就是说,另一件似乎产生重大影响的事情是将其他两个项目的引用同时添加到Core Library测试项目而不是一次添加。

答案 2 :(得分: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": {}

},