【问题标题】:ABTesting by using an ActionFilterAttribute使用 ActionFilterAttribute 进行 ABTesting
【发布时间】:2013-08-19 15:38:37
【问题描述】:

我们正在考虑使用 MVC3 进行一些单元测试。我认为一个合理的解决方案是标记动作以返回“B”视图并标记其他动作以便记录结果。

控制器可能看起来像这样:

[AB(ABModes.View)]
public ActionResult SignUp()
{
    return View();
}

[HttpPost]
public ActionResult SignUp(int id)
{
    return RedirectToAction("Confirmation");
    return View();
}

[AB(ABModes.Result)]
public ActionResult Confirmation()
{
    return View();
}

SignUp 将返回 A 或 B 视图,而 Confirmation 将记录使用了哪个视图。

属性看起来像这样:

using System;
using System.Web.Mvc;

namespace ABTesting.lib
{
    public class ABAttribute : ActionFilterAttribute
    {
        private ABModes mode;
        private Abstract.IABChooser abChooser;
        private Abstract.IABLogMessenger abMessenger;

        public ABAttribute(ABModes mode) : this(mode, new Concrete.ABChooser(), null)
        {

        }

        public ABAttribute(ABModes mode, Abstract.IABChooser abChooser, Abstract.IABLogMessenger abMessenger)
        {
            this.mode = mode;
            this.abChooser = abChooser;
            this.abMessenger = abMessenger;
        }


        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            var result = filterContext.Result as ViewResultBase;
            var action = filterContext.Controller.ControllerContext.RouteData.Values["action"].ToString();
            var actionName = String.IsNullOrEmpty(result.ViewName) ? action : result.ViewName;
            if(mode == ABModes.View)
                result.ViewName = String.Format("{0}{1}", actionName, abChooser.UseB()? "_B" : String.Empty);
            else{
                var controller = filterContext.Controller.ControllerContext.RouteData.Values["controller"].ToString();
                if (abMessenger != null)
                    abMessenger.Write(new Entities.ABLogMessage
                                          {
                                              DateCreated = DateTime.Now,
                                              ControllerName = controller,
                                              ActionName = actionName,
                                              IsB = abChooser.UseB()
                                          });
            }
            base.OnActionExecuted(filterContext);
        }
    }
}

public interface IABChooser
{
    bool UseB();
}

public interface IABLogMessenger
{
    void Write(ABLogMessage message);
}

这似乎是一种以最少的代码更改来完成此任务的合理方法吗?

【问题讨论】:

    标签: asp.net-mvc-3 ab-testing actionfilterattribute


    【解决方案1】:

    这似乎是一个合理的解决方案。我知道这一点是因为我使用同样的概念来开发 A/B 测试框架 (http://www.nuget.org/packages/AbTestMaster)。它在 nuget 上免费提供,并且也是开源的。

    这可能会让你的生活稍微简单一些。

    【讨论】:

      猜你喜欢
      • 2012-01-11
      • 2018-02-20
      • 2016-02-07
      • 2014-04-27
      • 1970-01-01
      • 1970-01-01
      • 2016-05-03
      • 1970-01-01
      相关资源
      最近更新 更多