代码之家  ›  专栏  ›  技术社区  ›  morganpdx

模拟操作筛选器中使用的web服务

  •  0
  • morganpdx  · 技术社区  · 15 年前

    因此,我不能在操作过滤器中模拟(使用Moq,顺便说一句)web服务,因为我不能将我的模拟WS注入到操作过滤器中,因为操作过滤器不将对象作为参数。正确的?至少我看起来是这样的。

    有什么想法吗?更好的方法?我只是想提醒用户,如果web服务不可用,他们的体验可能会受到限制。

    谢谢你的帮助!

    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 回复  |  直到 15 年前
        1
  •  1
  •   Darin Dimitrov    15 年前

    这里有一个快速而肮脏的方法:

    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();
    

    one suggested by @Ryan 但它在某些情况下可能会起作用。