Макет веб-службы, используемой в фильтре действий - PullRequest
0 голосов
/ 10 сентября 2010

У меня есть веб-служба для решения проблемы, которую я использую в ActionFilter.Фильтр действий захватывает некоторые основные данные для моей MasterPage.Я перешел между использованием фильтра действий и расширением базового класса контроллера и решил, что фильтр действий - лучший подход.Затем я начал модульное тестирование (Да, да, TDD. В любом случае ...: D)

Так что я не могу смоделировать (используя Moq, кстати) веб-сервис в фильтре действий, потому что я не могу внедрить своймакетируйте WS в фильтр действий, поскольку фильтры действий не принимают объекты в качестве параметров.Правильно?По крайней мере, к этому я, кажется, и пришел.

Есть идеи?Лучше подходит?Я просто пытаюсь вернуть пользователю предупреждение о том, что если веб-сервис недоступен, его опыт может быть ограничен.

Спасибо за любую помощь!

namespace MyProject.ActionFilters
{
    public class GetMasterPageData : ActionFilterAttribute
    {
        public ThatWS ws = new ThatWS();

        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            HttpContextBase context = filterContext.HttpContext;

            try {
                DoStuff();
            }
            catch ( NullReferenceException e ) {
                context.Session["message"] = "There is a problem with the web service.  Some functionality will be limited.";
            }
        }
    }
}

1 Ответ

1 голос
/ 12 сентября 2010

Вот быстрый и грязный подход:

public class GetMasterPageData : ActionFilterAttribute
{
    public Func<ISomeInterface> ServiceProvider = () => new ThatWS();

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var result = ServiceProvider().SomeMethod();
        ...
    }
}

И в своем модульном тесте вы можете создать экземпляр фильтра действий и заменить открытое поле ServiceProvider каким-нибудь фиктивным объектом:

objectToTest.ServiceProvider = () => new SomeMockedObject();

Конечно, этот подход не такой чистый, как , предложенный @ Ryan в разделе комментариев, но он может работать в некоторых ситуациях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...