2015-03-10 12 views
7

Zamanlanmış bir iş denetleyicisi yapıyorum - bu işler sonucu yakalayan Denetleyici ve Eylem. Tüm bunların arka uçta olmasını ve http çağrılarını içermemesini tercih ederim.ASP.NET MVC başlatılır Denetleyici ve eylemi programlı olarak çağırma

Onun tür Birim test ile ne gibi - örneğin:

var controller = new TestController(); 
var result = controller.Index("TestParameter") as ViewResult; 
konu denetleyici ve eylem dinamik değildir bu örnekte olduğu

, herkes bir denetleyici nasıl başlatıldığını biliyoruz ve bir eylem sesleniyor denetleyici adı ve dize parametresi olarak eylem ile? Mesela -

public ActionResult run(string controllerName, string actionName) 
{ 
    var controller = new Controller(controllerName); 
    var result = controller.action(actionName).("TestParameter") as ViewResult; 
    return Content(result); 
} 
+0

bir kontrolörün amacı tarayıcı isteklerini ele almaktır. Başka bir sınıftan MVC denetleyicisini mi çağırıyorsunuz? – im1dermike

+0

Evet Yukarıdaki çalıştırma eylemi gibi başka bir tek denetleyici eyleminden birçok denetleyiciyi ve eylemi aramak istiyorum. – Harleyz

+6

MVC denetleyicisini çağırması gereken tek şey tarayıcıdır. – im1dermike

cevap

13

dinamik eylemi yürütmek için ActionDescriptor birlikte ControllerFactory kullanın: gerçek bir sorun olduğu

public ActionResult Run(string controllerName, string actionName) 
{ 
    // get the controller 
    var ctrlFactory = ControllerBuilder.Current.GetControllerFactory(); 
    var ctrl = ctrlFactory.CreateController(this.Request.RequestContext, controllerName) as Controller; 
    var ctrlContext = new ControllerContext(this.Request.RequestContext, ctrl); 
    var ctrlDesc = new ReflectedControllerDescriptor(ctrl.GetType()); 

    // get the action 
    var actionDesc = ctrlDesc.FindAction(ctrlContext, actionName); 

    // execute 
    var result = actionDesc.Execute(ctrlContext, new Dictionary<string, object> 
    { 
     { "parameterName", "TestParameter" } 
    }) as ActionResult; 

    // return the other action result as the current action result 
    return result; 
} 

— istiyorsun yatıyor emin değilim MSDN

+0

Herhangi bir HttpContext erişimine dikkat etmelisiniz, ancak .... –

+0

Yukarıdaki koddan, Programlı İşler işlevlerimi uygulamamda oluşturabildiğimi ve çekicilik gibi çalıştığını söylemek isterim Birçok ay boyunca :) Biz zamanlama programında çalıştırmak için herhangi bir eylem planlayabiliriz, sanırım MVC tasarlanan şekilde olmasa da, bu harika bir çözüm. Cheers @ haim770! – Harleyz

-3

Bkz kontrolör/eylem test etmek ya da işlerin işlevselliğini test etmek istiyorsun? Eğer denetleyici/eylem test etmek gerekirse

  1. o HttpContext yer alacak.
  2. Eğer iş işlevselliği servis/depo katmanda içinde ve depo desen kullanarak testleri yapabilirsiniz ayırmak için iyi bir yol test etmek gerekir.
İlgili konular