为什么我的扩展方法没有出现在我的测试类中?

问题描述 投票:0回答:4

我在

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

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
的存根类,但这也不起作用。为什么?

或者我的处理方式是错误的吗?

c# unit-testing extension-methods
4个回答
31
投票

确保您已经:

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

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

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


3
投票

我怀疑这与您向现有的

System.Security.Principal
命名空间添加了扩展方法有关。确保引用定义扩展方法的项目,或尝试使用不同的命名空间。


2
投票

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


0
投票

我能找到的有关 VB.NET 单元测试的文档非常少。我必须通过反复试验发现,默认情况下,VB.NET 中的扩展方法只能在当前程序集中工作。这是因为 VB.NET 中的静态类是一个模块,并且模块作用域默认为“Friend”(内部)。

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

© www.soinside.com 2019 - 2024. All rights reserved.