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

6

我创建了一个扩展方法叫做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;
        }
    }
}

我这样调用它:

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 Copsey
1
你确定你的测试项目引用了包含扩展方法的程序集(而不仅仅是命名空间)吗? - Justin Niessner
@Reed:我编辑了问题并添加了缺失的代码。 - Robert Harvey
4个回答

31

请确保您已经:

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

请注意,您的示例中可能存在一个拼写错误,即该方法不在一个类中。

最后,请避免将方法放入官方的.NET命名空间。这会令阅读代码的人混淆,因为他们可能会认为该方法是官方支持的方法,而实际上它只是您自己项目中的方法。


1
虽然你的事实是正确的,但我不同意你关于扩展框架类的观点。这是它们的主要目的。 - Steven Sudit
2
@Steven - 扩展框架类是可以的。不好的是将这些扩展放在框架命名空间中。 - Greg
3
我会将它们放在MyProject.SecurityExtensions命名空间中,这样把它们放在.Net框架类中会产生误导。如果你不查看源代码,就无法知道这是你的自定义扩展。如果放在你自己的命名空间中,只需将鼠标悬停在上面即可知道它是定制的。 - Mark
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+单击来查看源代码。 - Mark
我编辑了答案,包括 using。我已经做过几次这样的事情,当我把所有扩展方法放入一个单独的静态类中,然后想知道为什么它们没有出现在通常的位置时。 - steve cook
显示剩余6条评论

3

我怀疑这与您向现有的System.Security.Principal命名空间添加扩展方法有关。请确保引用定义扩展方法的项目,或尝试使用其他命名空间。


2
扩展方法应该在一个静态类中。你的静态类在哪里?你的代码是否编译通过?

0

我在VB.NET的单元测试方面找到的文档非常少。我不得不通过试错发现,默认情况下,VB.NET中的扩展方法仅在当前程序集中起作用。这是因为VB.NET中的静态类是一个模块,而模块范围默认为“Friend”(内部)。

如果您想在引用了单元测试项目的项目中单元测试扩展方法,请使用“Public Module”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接