2010-03-26 2 views
5

Я создал метод расширения под названием 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(... 

, но не IntelliSense HasContentPermission. Я попытался создать класс заглушки, который наследует от IIdentity, но это тоже не сработало. Зачем?

Или я об этом ошибаюсь?

+0

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

+1

Вы уверены, что ваш тестовый проект ссылается на сборку, в которой живет ваш метод расширения (а не просто на пространство имен)? –

+0

@Reed: Я отредактировал вопрос, чтобы добавить недостающий код. –

ответ

14

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

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

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

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

+0

Спасибо. Я забыл добавить ссылку на основной проект в тестовом проекте. Я всегда забываю это сделать. По какой-то причине я всегда предполагаю, что, поскольку оба проекта находятся в одном и том же решении, они знают друг о друге. –

+1

Пока вы правы по фактам, я должен не согласиться с вашим мнением о расширении каркасных классов. Это их главная цель. –

+2

@Steven - Прекрасно расширять рамки классов. Что плохого, это размещение этих расширений в пространстве имен framework. – Greg

2

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

+0

Извините. Я отредактировал вопрос, чтобы добавить недостающий код. –

3

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

+0

+1 для ссылки на проект ... В этом была проблема. –

+0

+1 для проблемы с пространством имен. Это была моя проблема. – Sumant

Смежные вопросы