0

Прошу прощения, если это дублирующий вопрос (я не нашел ничего подобного). Я пытаюсь построить сервис и модульное тестирование OpenId проверки подлинности это, в настоящее время у меня есть следующие настройки:Модульное тестирование OpenIdRelyingParty

public class OpenIdAuthenticationService : IAuthenticationService 
{ 
    private IConfigurationService _configService; 
    private OpenIdRelyingParty  _openIdRelyingParty; 

    public OpenIdAuthenticationService(IConfigurationService configService) 
    { 
     _configService  = configService; 
     _openIdRelyingParty = new OpenIdRelyingParty();    
    } 
} 

Видимо OpenIdRelyingParty необходим доступ к HttpContext, есть способ издеваться OpenIdRelyingParty и ввести его службу? Или, может быть, mock HttpContext и предоставить его OpenIdRelyingParty?

ответ

1

Чтобы издеваться над HttpContext для OpenIdRelyingParty, вы должны изменить код этого класса. Даже вы потратили бы время на издевательство над этим, потому что это запечатанный класс (но не исключено, что вы можете использовать MOCKWCF).

Я думаю, что лучше сделать обертку или адаптер для OpenIdRelyingParty. например:

public class OpenIdRelyingPartyWrapped 
{ 
    private OpenIdRelyingParty openIdRelyingPartyTarget; 
    .... 
    public virtual IAuthenticationRequest CreateRequest(string text) 
    { 
     return this.openIdRelyingPartyTarget.CreateRequest(text); 
    } 
    ... 
} 

Тогда вы сможете издеваться над этим, как хотите.

+0

Спасибо, мне нравится этот подход, но в этом случае, как бы я инициализировал OpenIdRelyingParty? Должен ли я инициализировать его из оболочки и вводить? Или я должен проверить, является ли оно нулевым и определить значение по умолчанию? Или я чего-то не хватает? –

+1

Это зависит от стратегии создания экземпляров, если вы используете ** IOC **, вы должны сохранить это, тогда инъекция будет выполняться конструктором или с помощью свойства. Если вы не используете IOC, вы можете просто создать экземпляр в конструкторе ** OpenIdRelyingPartyWrapped **. Для или ваших модульных тестов вы должны сделать класс mock, который наследует от ** OpenIdRelyingPartyWrapped ** и переопределяет методы, которые вы хотите высмеять. –

1

Я бы, так как вы уже это сделали, введите OpenIdRelyingParty в свой конструктор, как вы это делаете, с вашим сервисом конфигурации.

Запрет на то, что вы можете высмеивать HttpContext в своем модульном тесте. HttpContext.Current имеет сеттер, поэтому установите его в макет/заглушку HttpContextBase. Вот пример использования NSubstitute с NUnit:

[TearDown] 
public void CleanUp() 
{ 
    HttpContext.Current = null; 
} 

[Test] 
public void FakeHttpContext() 
{ 
    var context = Substitute.For<HttpContextBase>(); 
    var request = Substitute.For<HttpRequestBase>(); 
    context.Request.Returns(request); 
    //Do any more arragement that you need. 

    //Act 

    //Assert 
} 

Это для меня было бы немного кода запаха, хотя. Это тестирование зависимостей зависимостей (или, насколько это далеко от того, что происходит у кроличьей дыры). Это полезно, хотя при рефакторинге это не вариант.

+0

Спасибо, что я могу извлечь OpenIdRelyingParty и ввести его через конструктор, однако как бы инициализировать его в своем модульном тесте? Это требует HttpContext, и все же нет способа его предоставить? –

+1

@ 2Dim1 Внедрить интерфейс через конструктор, а затем вымыть интерфейс. Таким образом, не используется «реальная» реализация, и она никогда не ударит по HttpContext. – vcsjones

+0

Я ценю вашу помощь. Честно говоря, я пробовал это, однако, похоже, что OpenIdRelyingParty - это не реализация IOpenIdRelyingParty в DotNetOpenAuth? Разве я что-то не хватает? –

1

OpenIdRelyingParty может использоваться в модульных тестах с использованием перегрузок метода, которые принимают HttpRequestBase, который полностью макет. Только методы, которые не принимают это как параметр, требуют HttpContext.Current.

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