ASP.NET MVC:单元测试EditorFor生成一个空的MvcHtmlString

问题描述 投票:0回答:1

我正在MVC 5项目上,并且我有一个单元测试,它检查生成的html标记以查找自定义html助手。

private class Faq
    {
        [RequiredIfMultiple(new string[] { "SickLeave", "Holidays" }, new object[] { 2, 2 })]
        [RequiredIfMultiple(new string[] { "SickLeave1", "SickLeave2", "SickLeave3" }, new object[] { 2, 2, 2 })]
        public string Property { get; set; }
    }

[Test]
    public void HtmlString_With_RequiredIfMultiple_Test()
    {
        //Arrange
        Expression<Func<Faq, string>> expression = (t => t.Property);

        //Act
        IHtmlString result = htmlHelper.EditorForRequiredIf(expression);

        // Assert
        Assert.IsTrue(result.ToString().Contains("data-val-requiredifmultiple"));
    }

HTML帮助程序扩展EditorForRequiredIf

public static MvcHtmlString EditorForRequiredIf<TModel, TValue>(this HtmlHelper<TModel> helper
        , Expression<Func<TModel, TValue>> expression
        , string templateName = null
        , string htmlFieldName = null
        , object additionalViewData = null)
    {
        string mvcHtml = EditorExtensions.EditorFor(helper, expression, templateName, htmlFieldName, additionalViewData).ToString();            
        string element = helper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(ExpressionHelper.GetExpressionText(expression));
        string key = helper.ViewData.Model.ToString() + "." + element;

        if (RequiredIfMultipleAttribute.CountPerField != null)
        {
            RequiredIfMultipleAttribute.CountPerField.Remove(key);
            if (RequiredIfMultipleAttribute.CountPerField.Count == 0)
            {                    
                RequiredIfMultipleAttribute.CountPerField = null;
            }
        }

        string pattern = @"data\-val\-requiredif[a-z]+";

        return Regex.IsMatch(mvcHtml, pattern) ? MergeClientValidationRules(mvcHtml) : MvcHtmlString.Create(mvcHtml);
    }

在视图中,EditorFor在自定义属性RequiredIfMultipleAttribute上调用GetClientValidationRules方法以生成带有适当数据值标记的html标记。

GetClientValidationRules方法:

public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        int count = 0;
        string key = metadata.ContainerType.FullName + "." + metadata.PropertyName;            

        if (CountPerField == null)
        {
            CountPerField = new Dictionary<string, int>();
        }

        if (CountPerField.ContainsKey(key))
        {               
            count = ++CountPerField[key];
        }
        else
        {
            CountPerField.Add(key, count);
        }

        yield return new RequiredIfMultipleValidationRule(ErrorMessageString, Props, Vals, count);
    }

因此,在生产中,所有这些都可以完美地工作。 但是在测试中,我的时间很糟糕。我得到的是string mvcHtml = EditorExtensions.EditorFor(helper, expression, templateName, htmlFieldName, additionalViewData).ToString();和调用堆栈上的空字符串,我看不到方法GetClientValidationRules已被调用。

另一方面,如果我将InputExtensions.TextBoxFor更改为[[EditorExtensions.EditorFor,我看到MvcHtmlString正确生成并且调用了[[GetClientValidationRules。

有人知道吗?]我希望我足够清楚。

我正在MVC 5项目上,我有一个单元测试,该测试检查生成的html标记中是否存在自定义html助手。私有类常见问题解答{[[RequiredIfMultiple(new string [] {“ SickLeave”,“ ...

c# asp.net-mvc nunit visual-studio-2019
1个回答
0
投票
© www.soinside.com 2019 - 2024. All rights reserved.