Почему мой метод расширения не отображается в моем тестовом классе? - PullRequest
5 голосов
/ 26 марта 2010

Я создал метод расширения с именем 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, но это тоже не сработало Почему?

Или я поступаю неправильно?

Ответы [ 3 ]

17 голосов
/ 26 марта 2010

Убедитесь, что вы:

  1. сделал класс статическим
  2. сделал класс доступным для вызывающего кода
  3. включено this перед расширением типа
  4. построил проект, содержащий расширение
  5. добавил ссылку на проект в ваш проект модульного теста
  6. добавил using mypackage; к любому исходному файлу, который использует метод расширения, если ваш метод расширения содержится в другом пакете

Обратите внимание, что вы также получили (я полагаю) опечатку в вашем примере, поскольку метод отсутствует в классе.

Наконец, я бы не стал добавлять методы в официальные пространства имен .NET. Это может сбить с толку любого, кто придет после вас, и может подумать, что этот метод является официально поддерживаемым методом, хотя в действительности он ваш и содержится в вашем проекте.

3 голосов
/ 26 марта 2010

Я подозреваю, что это связано с тем, что вы добавили метод расширения в существующее пространство имен System.Security.Principal. Убедитесь, что вы ссылаетесь на проект, который определяет метод расширения, или попробуйте его с другим пространством имен.

2 голосов
/ 26 марта 2010

Метод расширения должен быть в статическом классе. Где твой статический класс? Ваш код компилируется?

...