C #: классы модульного тестирования веб-приложения - PullRequest
3 голосов
/ 07 октября 2009

Я работаю над приложением веб-сервера, которое обрабатывает запросы, полученные с мобильных телефонов. У меня есть адаптеры запросов, которые адаптируют запросы от телефона в классах запросов, которые я использую в остальной части приложения. Что делает каждый адаптер запросов, так это то, что он обращается к одному объекту в сеансе и изменяет одно из его свойств. Теперь вопрос: я хочу написать модульный тест, который будет тестировать этот адаптер запроса, но у меня нет сессии, пока я выполняю тест. Можно ли как-нибудь создать сеанс или что-то подобное для проверки всего адаптера?

Заранее спасибо

1 Ответ

5 голосов
/ 07 октября 2009

То, что вы хотите сделать, это заменить напрямую, используя сеанс в ваших адаптерах. Вы хотите создать интерфейс, похожий на

public interface ISessionableObject
{
    MyData Data { get; set; }
}

, а затем создайте 2 реализующих класса, аналогичных

public class HttpSessionedObject : ISessionableObject
{
    public MyData Data {
        get { return Session["mydata"]; }
        set { Session["mydata"] = value; }
    }
}

public class DictionaryObject : ISessionableObject
{
    private readonly Dictionary<string, MyData> _dict = 
                                    new Dictionary<string, MyData>();

    public MyData Data {
        get { return dict ["mydata"]; }
        set { dict ["mydata"] = value; }
    }
}

Edit:

Просто если у вас есть путаница, что делать с этим, я уверен, что у вас есть что-то вроде этого:

public class Adapter
{
    public void DoSomething()
    {
         var data = Session["mydata"];
        ...
    }
}

Вместо этого вы захотите что-то вроде этого

public class Adapter
{
    private readonly ISessionableObject _session;

    public Adapter(ISessionableObject session)
    {
        _session = session;
    }

    public void DoSomething()
    {
         var data = _session.Data;
        ...
    }
}

Я бы рекомендовал использовать Dependency Injection Framework, например StructureMap, для управления созданием ваших объектов, но это гораздо более обширная тема, не связанная с этим, поэтому, по крайней мере, при внедрении зависимостей от плохого человека ваш код будет похож на

public class AdapterUser
{
    public void UsingPhone()
    {
        var adapter = Adapter(new HttpSessionedObject());
        ...
    }
}

И

[UnitTest]
public class AdapterUserTest
{

    [Test]
    public void UsingPhone()
    {
        var adapter = Adapter(new DictionaryObject());
        ...
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...