【问题标题】:Why is my Extension Method not showing up in my test class?为什么我的扩展方法没有出现在我的测试类中?
【发布时间】:2010-03-26 17:12:59
【问题描述】:

我在System.Security.Principal.IIdentity 上创建了一个名为HasContentPermission 的扩展方法:

namespace System.Security.Principal
{
    public static class IdentityExtensions
    {
        public static bool HasContentPermission
            (this IIdentity identity, int contentID)
        {
            // I do stuff here
            return result;
        }
    }
}

我这样称呼它:

bool hasPermission = User.Identity.HasPermission(contentID);

像魅力一样工作。现在我想对它进行单元测试。为此,我真正需要做的就是直接调用扩展方法,所以:

using System.Security.Principal;

namespace MyUnitTests
{
    [TestMethod]
    public void HasContentPermission_PermissionRecordExists_ReturnsTrue()
    {
        IIdentity identity;
        bool result = identity.HasContentPermission(...

但是HasContentPermission 不会智能感知。我尝试创建一个继承自IIdentity 的存根类,但这也不起作用。为什么?

或者我是不是走错了路?

【问题讨论】:

  • 您在第一个代码块中的语法是错误的 - 您不能在命名空间范围内定义方法...您可以输入您的实际代码吗?
  • 您确定您的测试项目引用了您的扩展方法所在的程序集(而不仅仅是命名空间)?
  • @Reed:我编辑了问题以添加缺少的代码。

标签: c# unit-testing extension-methods


【解决方案1】:

确保您已经:

  1. 将类设为静态
  2. 使调用代码可以访问该类
  3. 在要扩展的类型之前包含this
  4. 构建了包含扩展的项目
  5. 在您的单元测试项目中添加了对该项目的引用
  6. 如果您的扩展方法包含在不同的包中,则将using mypackage; 添加到使用扩展方法的任何源文件中

请注意,您的示例中也有(我假设)一个错字,因为该方法不在类中。

最后,我会避免将方法放入官方的 .NET 命名空间中。它只会让任何追随您的人感到困惑,他们可能认为该方法是官方支持的方法,而实际上它是您自己的并包含在您的项目中。

【讨论】:

  • 谢谢。我忘记在测试项目中添加对主项目的引用。我总是忘记这样做。出于某种原因,我总是假设,因为两个项目都在同一个解决方案中,所以它们是相互了解的。
  • 虽然您在事实上是对的,但我不同意您对扩展框架类的看法。这是他们的主要目的。
  • @Steven - 扩展框架类很好。不好的是将这些扩展放在框架命名空间中。
  • 我也会将它们放在 MyProject.SecurityExtensions 命名空间中,而将它们放在 .Net 框架类中会产生误导。如果不去源头,您将无法知道这是您的自定义扩展。如果它在您自己的命名空间中,只需将鼠标悬停在它上面就会告诉您它是定制的。
  • @Robert Harvey:我们在所有项目中都有一个MyCompany.Core 程序集。我们把我们的扩展放在那里。如果我将鼠标悬停在一个说“System.Security.Principal.DoSomething”的方法上,我希望在这里找到 DoSomething msdn.microsoft.com/en-us/library/system.security.principal.aspx。如果它说 MyCompany.Core.SecurityExtensions.DoSomethig,我会确切地知道它在哪里。如果我知道我们编写了源代码,我也更有可能通过 CTRL+单击找到源代码。
【解决方案2】:

我怀疑这与您将扩展方法添加到现有 System.Security.Principal 命名空间这一事实有关。请确保您引用了定义扩展方法的项目,或者尝试使用不同的命名空间。

【讨论】:

    【解决方案3】:

    扩展方法应该在静态类中。你的静态类在哪里?你的代码编译了吗?

    【讨论】:

      【解决方案4】:

      我几乎找不到关于 VB.NET 单元测试的文档。我不得不通过反复试验发现,默认情况下,VB.NET 中的扩展方法仅适用于当前程序集。这是因为 VB.NET 中的静态类是一个模块,模块范围默认为“朋友”(内部)。

      如果您想在单元测试项目中引用的项目中对您的扩展方法进行单元测试,请使用“公共模块”。

      【讨论】:

        猜你喜欢
        • 2019-12-03
        • 2021-12-08
        • 2019-01-17
        • 2014-12-04
        • 2015-03-09
        • 2022-12-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多