c#单元测试模拟类属性

时间:2018-06-13 18:29:20

标签: c# unit-testing asp.net-mvc-5

在我的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

1 个答案:

答案 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());
    }

它有效。谢谢!