C# 单元测试元数据类型
我正在开发一个ASP.NET MVC 2应用程序,并像这样测试我的ViewmodelsC# 单元测试元数据类型,c#,asp.net,unit-testing,asp.net-mvc-2,asp.net-mvc-2-metadata,C#,Asp.net,Unit Testing,Asp.net Mvc 2,Asp.net Mvc 2 Metadata,我正在开发一个ASP.NET MVC 2应用程序,并像这样测试我的Viewmodels [TestMethod] public void EmailNeedsToBeSet() { var pvm = new ProfileViewModel {Email = ""}; var validationResults = new ValidationResults(); var result = Validator.TryValidateObject(pvm, new Val
[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));
}
下面是我如何对这类代码进行单元测试:
[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;
}
}
[TestMethod]
当带有元数据的属性无效时,public void IsValid返回ValidationResult错误
{
var sut=新用户
{
Login=“太长!!!”
};
var-actual=sut.IsValid();
Assert.IsNotNull(实际值);
断言.AreEqual(1,实际.Count);
Assert.AreEqual(1,实际[0].MemberNames.Count());
var firstValidationError=实际值[0];
AreEqual(“Login”,firstValidationError.MemberNames.First());
AreEqual(“字段登录必须是最大长度为4的字符串。”,firstValidationError.ErrorMessage);
}
[测试方法]
当包含元数据的属性有效时,public void IsValid\u返回\u Empty\u错误列表\u
{
var sut=新用户
{
Login=“abcd”
};
var-actual=sut.IsValid();
Assert.IsNotNull(实际值);
Assert.AreEqual(0,实际的.Count);
}
[元数据类型(typeof(UserMetaData))]
公共部分类用户:BaseEntity
{
公共字符串登录{get;set;}
公共类用户元数据
{
[必需]
[第(4)款]
公共字符串登录{get;set;}
}
}
公共抽象类BaseEntity
{
受保护的BaseEntity()
{
RegisterMetadata();
}
私有无效注册表元数据()
{
var currentType=GetType();
var metadataType=GetMetadataType();
if(metadataType==null)
返回;
var descriptorProvider=新关联的MetadataTypeDescriptionProvider(currentType,metadataType);
AddProviderTransparent(描述符提供者,currentType);
}
私有类型GetMetadataType()
{
var attribute=attribute.GetCustomAttributes(this.GetType()).ToList().Find(t=>t是MetadataTypeAttribute);
返回(属性!=null)
((MetadataTypeAttribute)属性)。MetadataClassType
:null;
}
公共虚拟列表有效()
{
var validationErrors=新列表();
var context=newvalidationcontext(this,null,null);
TryValidateObject(this,context,validationErrors,true);
返回验证错误;
}
}
[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;
}
}