在我的MVC项目中,我必须设置一个控制器类属性:
public class ResponsableAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
var controller = (BaseController)filterContext.Controller;
if (!controller.EstResponsable)
{
filterContext.Result = controller.RedirectionForcee(Alertage.Information, ConstantesUi.Misc.MessageResponsable);
}
}
}
忍受我,代码是法语:
[Responsable]
public class ParamLivraisonController : BaseController
因此,每个动作在执行之前都必须通过该属性,这是预期的行为。
但我不知道如何对此属性进行单元测试,将返回值设置为false,以便controller.RedirectionForcee
(返回RedirectToRouteResult
)实际完成其工作。
如果我调用任何控制器方法:
[TestMethod]
public void ParamLivraisonController_GererLivraison_Get()
{
ControleurAsynchrone.ObtenirLivraisons().Returns(ObtenirListeLivraison());
var retour = _ctrl.GererLivraisons();
Assert.IsNotNull(retour);
}
未触及或测试该属性。怎么测试呢?我正在使用nSubstitute和mvcFakes,我不知道如何替换ActionExecutingContext
。
答案 0 :(得分:3)
感谢@Kenneth K.,我找到了答案。 @Nkosi也是正确的,提到测试应该在属性本身上。
这是:
[TestMethod]
public void ValiderAttribut_EstResponsable()
{
var attribut = new ResponsableAttribute(); // Instantiation of the attribute
var controller = ObtenirController(); // Gets the controller via MvcFakes
SecuriteHelper.VerifierResponsable().Returns(true); // Sets the desired return value
var test = Substitute.For<ActionExecutingContext>(); // Substitute for ActionExecutingContext
test.Controller = controller; // Sets the controller to the context
attribut.OnActionExecuting(test); // Call the overrided method
Assert.IsNull(test.Result); // Check if the redirection occured
}
现在,为了验证测试是否正确,我还必须测试相反的结果:
[TestMethod]
public void ValiderAttribut_EstNonResponsable()
{
var attribut = new ResponsableAttribute();
var controller = ObtenirController();
SecuriteHelper.VerifierResponsable().Returns(false);
var test = Substitute.For<ActionExecutingContext>();
test.Controller = controller;
attribut.OnActionExecuting(test);
Assert.IsNotNull(test.Result);
Assert.AreEqual(typeof(RedirectResult), test.Result.GetType());
}
它有效。谢谢!