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

时间:2010-03-26 17:12:59

标签: c# unit-testing extension-methods

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

或者我是以错误的方式解决这个问题?

4 个答案:

答案 0 :(得分:15)

确保你已经:

  1. 使类静态
  2. 使类可以访问调用代码
  3. 在要扩展的类型之前包含this
  4. 构建了包含扩展名
  5. 的项目
  6. 在单元测试项目中添加了对项目的引用
  7. 如果您的扩展方法包含在不同的包中,则<{1}}向使用扩展方法的任何源文件添加using mypackage;
  8. 请注意,您的示例中还有(我假设)一个拼写错误,因为该方法不在类中。

    最后,我会避免将方法放入官方的.NET命名空间。对于那些可能会认为该方法是官方支持的方法的人来说,实际上它是您自己的并且包含在您的项目中时,它只会让您感到困惑。

答案 1 :(得分:3)

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

答案 2 :(得分:2)

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

答案 3 :(得分:0)

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

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