Можно ли смоделировать тип с атрибутом, используя Rhino.Mocks - PullRequest
2 голосов
/ 28 сентября 2011

У меня есть этот тип:

[RequiresAuthentication]
public class MobileRunReportHandler : IMobileRunReportHandler
{
  public void Post(MobileRunReport report)
  {
    ...
  }
}

Я подшучиваю над этим так:

var handler = MockRepository.GenerateStub<IMobileRunReportHandler>();
handler.Stub(x => x.Post(mobileRunReport));

Проблема в том, что созданный макет не имеет атрибута RequiresAuthentication.Как это исправить?

Спасибо.

РЕДАКТИРОВАТЬ

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

1 Ответ

1 голос
/ 06 октября 2011

Добавление Attribute к типу во время выполнения, а затем получение его с помощью отражения невозможно (см., Например, этот пост).Самый простой способ добавить атрибут RequiresAuthentication в заглушку - это создать заглушку самостоятельно:

// Define this class in your test library.
[RequiresAuthentication]
public class MobileRunReportHandlerStub : IMobileRunReportHandler
{
    // Note that the method is virtual. Otherwise it cannot be mocked.
    public virtual void Post(MobileRunReport report)
    {
        ...
    }
}

...

var handler = MockRepository.GenerateStub<MobileRunReportHandlerStub>();
handler.Stub(x => x.Post(mobileRunReport));

Или вы можете сгенерировать заглушку для типа MobileRunReportHandler.Но вы должны сделать его Post метод virtual:

[RequiresAuthentication]
public class MobileRunReportHandler : IMobileRunReportHandler
{
    public virtual void Post(MobileRunReport report)
    {
        ...
    }
}

...

var handler = MockRepository.GenerateStub<MobileRunReportHandler>();
handler.Stub(x => x.Post(mobileRunReport));
...