【问题标题】:Create Unit Tests is supported only within a public class or a public method VS 2015仅在公共类或公共方法 VS 2015 中支持创建单元测试
【发布时间】:2016-09-20 19:42:08
【问题描述】:

当我尝试为我的应用创建单元测试时,仅在公共类或公共方法中支持创建单元测试。我试图在 Visual Studio 2015 Enterprise 的一个非常简单的应用程序中测试公共方法。这是截图。

这是 Program.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace Scratch
{
    public class Program    //Originally this was just class Program
    {
        static void Main(string[] args)
        {

            Console.WriteLine("Hello world!");

        }

        public static string TruncateOld(string value, int length)
        {
            string result = value;
            if (value != null) // Skip empty string check for elucidation
            {
                result = value.Substring(0, Math.Min(value.Length, length));
            }
            return result;
        }

        public static string Truncate(string value, int length)
        {
            return value?.Substring(0, Math.Min(value.Length, length));
        }

    }
}

我找到了这个msdn article,但它并没有真正提供任何关于如何解决问题的建议。此外,我从未安装过“ALM Rangers Generate Unit Test”。

我从我的 Program.cs 中删除了除 Main 之外的所有内容,并使用以下代码添加了一个新的 Public Class1(我仍然收到错误并且菜单消失了):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Scratch
{
    public class Class1
    {


        public Class1()
        {

        }

        public string TruncateOld(string value, int length)
        {
            string result = value;
            if (value != null) // Skip empty string check for elucidation
            {
                result = value.Substring(0, Math.Min(value.Length, length));
            }
            return result;
        }

        public string Truncate(string value, int length)
        {
            return value?.Substring(0, Math.Min(value.Length, length));
        }


    }
}

【问题讨论】:

  • 重新打开解决方案是否有效?它应该根据social.msdn.microsoft.com/Forums/vstudio/en-US/… 带回菜单项。 (请参阅 Pratap Lakshman 的回复 [MSFT 于 2015 年 8 月 27 日星期四上午 7:47)
  • 它确实把它带回来了,直到我下次尝试添加单元测试,然后它又消失了。
  • 如果其他人可以复制此内容,我会很感兴趣。很难相信在这样一个微不足道的程序中添加单元测试是不可能的。我可以压缩整个解决方案并将其放在某个地方。我所做的只是创建一个新的控制台应用程序,向 UnitTestFramework 添加一个引用,添加 Program.cs 的附加代码,然后尝试添加一个单元测试。
  • 我会在那个论坛上发布这个。那里有更多的 MS 官员。可能是一个错误。
  • 我刚刚在我的机器上测试了它。我没有这个问题。我也有企业版。

标签: c# visual-studio unit-testing visual-studio-2015


【解决方案1】:

对于遇到此问题的 C# 新手,您需要将 public 关键字添加到您的类中。

例如,

class myProgram
{
    static void Main(string[] args)
    {
        Console.WriteLine("Hello World");
    }
}

您需要将第一行更改为public class myProgram

【讨论】:

  • 不确定这是问题的正确答案(他有“公开”),但对于我也有的消息,它有效。
  • 是的,那是我的希望,是一些新人会在这里结束,这样可以节省他们一些时间。
【解决方案2】:

可能来得太晚了,但既然我遇到了同样的问题并且能够解决它,你永远不知道谁会需要它。所以...一旦我删除了对Microsoft.VisualStudio.QualityTools.UnitTestFramework 的引用 “创建单元测试”选项重新出现在上下文菜单中,我能够创建我需要的测试。

【讨论】:

  • 是的。当引用它时,VS 似乎将程序集解释为测试程序集。该警告还具有误导性:该类必须是公共的并且至少有一个公共方法,否则它也会失败。
  • 至少一个公共方法是关键。无方法类将给出相同的错误消息。
【解决方案3】:

所以我知道这已经晚了,并且由于您的类定义,并不是对上述问题的真正答案,但我没有看到足够多的论坛关于这个错误,所以我决定在这里添加我的发现。

我发现如果你有一个只有属性而没有真正方法的类,“创建单元测试”将不起作用。即使您的属性是公开的并且具有复杂的 getter 或 setter。这是我遇到这个问题时的代码状态,因为我刚刚创建了这个类:

namespace some.Namespace
{
   using some.Namespace.Interfaces;
   using System;
   using System.Collections.Generic;

   public class SomeData : ISomeData
   {
      public bool SomeFlag => throw new NotImplementedException();

      public Dictionary<string, string> SomeFields => throw new NotImplementedException();

      public Dictionary<string, string> SomeOtherFields => throw new NotImplementedException();
   }
}

但是,您可以通过至少定义构造函数或临时创建一些随机方法来解决此问题。但是,请注意,我们只会为您的类中的真正方法进行测试,因此您仍然需要为您的属性的 getter/setter 手动编写测试。

希望有人觉得这个答案有帮助。

【讨论】:

    【解决方案4】:

    如果您指的是内置的 Visual Studio 2015 测试用例,则需要从公共成员中取出静态。像这样:

    [TestClass]
    public class UnitTests
    {
        [TestMethod]
        public void Testing_01()
        {
            Assert.IsTrue( [some bool condition] );
        }
    }
    

    【讨论】:

    • 我试过你的建议(见最后的代码 sn-p),但它仍然做同样的事情。
    • 我刚刚用一个带有 net framework 4.0 的新 winforms 项目对其进行了测试,它工作正常。它使用 truncateOld 测试方法的骨架创建了一个以“Tests”结尾的同名新项目。如果不起作用,请尝试像我发布的代码一样手动创建项目,可能存在未正确引用的程序集。
    • 我重新启动并创建了一个新的控制台解决方案,当我尝试添加单元测试时出现错误,但菜单项并没有消失。我创建了一个新的公共类,并且能够按预期创建一个单元测试项目。我不明白的是我没有在我的解决方案中添加对 Microsoft.VisualStudio.QualityTools.UnitTestFramework 的引用,所以我有点惊讶它的工作原理。
    • 我总是手动创建测试项目,因为它可以帮助我了解何时出现问题。如果您还没有,请查看测试资源管理器窗格,测试方法应该出现在那里,如果它们出现并运行,那么您可能不需要其他任何东西。
    • 我遇到了与这篇文章中所写相同的问题,并且没有一个解决方案对我有用。我什至尝试创建一个只有“Public ”和一个“public ”的新项目。同样的问题,除了现在“创建单元测试”甚至不会出现。
    【解决方案5】:

    显然,当我今天踏入它时,这仍然是一个兔子洞。就我而言,在 VS 2019 Enterprise 上运行。我的错误是在不需要的测试项目上安装了 NuGet 包。我添加了 NuGet 包 MSTest.TestAdapter 和 Microsoft.TestPlatform。删除、关闭和重新打开 IDE 会恢复创建测试方法的向导。对于初始或新的测试项目,开始时唯一需要的 NuGet 包是 Microsoft.VisualStudio.TestPlatform。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-17
      • 2018-09-27
      • 1970-01-01
      • 2015-09-16
      相关资源
      最近更新 更多