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

Rob*_*vey 5 c# extension-methods unit-testing

我创建了一个名为扩展方法HasContentPermissionSystem.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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我称之为:

bool hasPermission = User.Identity.HasPermission(contentID);
Run Code Online (Sandbox Code Playgroud)

奇迹般有效.现在我想对它进行单元测试.要做到这一点,我真正需要做的就是直接调用扩展方法,所以:

using System.Security.Principal;

namespace MyUnitTests
{
    [TestMethod]
    public void HasContentPermission_PermissionRecordExists_ReturnsTrue()
    {
        IIdentity identity;
        bool result = identity.HasContentPermission(...
Run Code Online (Sandbox Code Playgroud)

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

或者我是以错误的方式来做这件事的?

tva*_*son 21

确保你有:

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

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

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

  • 我会将它们放在一个`MyProject.SecurityExtensions`命名空间中,将它们放在.Net框架类中会产生误导.您无法知道这是您的自定义扩展程序而无需访问源代码.如果它在你自己的命名空间中,只需将鼠标悬停在它上面就会告诉你它是定制的. (3认同)
  • @Robert Harvey:我们在所有项目中都有一个`MyCompany.Core`程序集.我们把扩展放在那里.如果我徘徊在一个说"System.Security.Principal.DoSomething"的方法上,我希望在这里找到DoSomething http://msdn.microsoft.com/en-us/library/system.security.principal.aspx.如果它说MyCompany.Core.SecurityExtensions.DoSomethig,我会确切地知道它在哪里.如果我知道我写的话,我也更有可能按CTRL + Click来找到源代码. (3认同)
  • @Steven - 扩展框架类很好.将这些扩展放在框架命名空间中有什么不好. (2认同)