首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单元测试MetadataType

单元测试MetadataType
EN

Stack Overflow用户
提问于 2010-11-01 19:55:49
回答 1查看 846关注 0票数 4

我正在开发一个ASP.NET MVC2应用程序,我像这样测试我的视图模型

代码语言:javascript
复制
[TestMethod]
public void EmailNeedsToBeSet()
{
    var pvm = new ProfileViewModel {Email = ""};
    var validationResults = new ValidationResults();
    var result = Validator.TryValidateObject(pvm, new ValidationContext(pvm, null, null), validationResults, true);
    Assert.IsFalse(result);
    Assert.IsTrue(validationResults.ContainsField<ProfileViewModel>(m => m.Email));
}

电子邮件属性是必需的,此测试方法可以正常工作

我现在的问题是:如何像以前的测试那样测试MetaData类?验证结果始终为真。或者这是不可能的?

my MetaData-Class示例:

代码语言:javascript
复制
[MetadataType(typeof (UserMetaData))]
public partial class User
{
   public class UserMetaData
   {
      [Required(ErrorMessageResourceName = "Required",
      ErrorMessageResourceType = typeof (ValidationStrings))]
      [LocalizedDisplayName("LoginName", NameResourceType = typeof (Fields))]
      [StringLength(64)]
      public string Login { get; set; }
   }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-08-17 04:28:27

下面是我如何对这类代码进行单元测试:

代码语言:javascript
复制
    [TestMethod]
    public void IsValid_Returns_ValidationResult_Errors_When_Properties_With_Meta_Data_Are_Not_Valid()
    {
        var sut = new User
                      {
                          Login = "too long!!!"
                      };

        var actual = sut.IsValid();

        Assert.IsNotNull(actual);
        Assert.AreEqual(1, actual.Count);
        Assert.AreEqual(1, actual[0].MemberNames.Count());
        var firstValidationError = actual[0];
        Assert.AreEqual("Login", firstValidationError.MemberNames.First());
        Assert.AreEqual("The field Login must be a string with a maximum length of 4.", firstValidationError.ErrorMessage);
    }

    [TestMethod]
    public void IsValid_Returns_Empty_List_Of_Errors_When_Properties_With_Meta_Data_Are_Valid()
    {
        var sut = new User
                      {
                          Login = "abcd"
                      };

        var actual = sut.IsValid();

        Assert.IsNotNull(actual);
        Assert.AreEqual(0, actual.Count);
    }

[MetadataType(typeof(UserMetaData))]
public partial class User : BaseEntity
{
    public string Login { get; set; }

    public class UserMetaData
    {
        [Required]              
        [StringLength(4)]       
        public string Login { get; set; }
    }
}

public abstract class BaseEntity
{
    protected BaseEntity()
    {
        RegisterMetadata();
    }

    private void RegisterMetadata()
    {
        var currentType = GetType();

        var metadataType = GetMetadataType();

        if (metadataType == null)
            return;

        var descriptorProvider = new AssociatedMetadataTypeTypeDescriptionProvider(currentType, metadataType);
        TypeDescriptor.AddProviderTransparent(descriptorProvider, currentType);
    }

    private Type GetMetadataType()
    {
        var attribute = Attribute.GetCustomAttributes(this.GetType()).ToList().Find(t => t is MetadataTypeAttribute);

        return (attribute != null)
                   ? ((MetadataTypeAttribute)attribute).MetadataClassType
                   : null;
    }

    public virtual List<ValidationResult> IsValid()
    {
        var validationErrors = new List<ValidationResult>();
        var context = new ValidationContext(this, null, null);
        Validator.TryValidateObject(this, context, validationErrors, true);

        return validationErrors;
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4068623

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档