如何解决单元测试未按预期响应
我在我的项目中使用了 Validationaspect, 我有流畅的验证规则,这些是简单的规则,比如不接受字段空白。 验证在调试器模式下工作,抛出 fluentvalidation.validationexception
在调试器模式下一切正常!!!
using Castle.DynamicProxy;
public class ValidationAspect:MethodInterception
{
Type _validatorType;
public ValidationAspect(Type validatorType)
{
if(!typeof(IValidator).IsAssignableFrom(validatorType))
{
//farkli validator yollandı
throw new System.Exception(AspectMessages.WrongValidationType);
}
_validatorType = validatorType;
}
protected override void OnBefore(IInvocation invocation)
{
var validator = (IValidator)Activator.CreateInstance(_validatorType);
var entityType = _validatorType.BaseType.GetGenericArguments()[0];
var entities = invocation.Arguments.Where(t => t.GetType() == entityType);
foreach (var entity in entities)
{
ValidationTool.Validate(validator,entity);
}
}
}
public static class ValidationTool
{
public static void Validate(IValidator validator,object entity)
{
var context = new ValidationContext<object>(entity);
var result = validator.Validate(context);
if (result.Errors.Count > 0)
{
throw new ValidationException(result.Errors);
}
}
}
[TestClass]
public class PersonManagerTest
{
[TestMethod]
[ExpectedException(typeof(ValidationException))]
public void product_add_validation_check()
{
Mock<IPersonDal> mock = new Mock<IPersonDal>();
PersonManager productManager = new PersonManager(mock.Object);
productManager.AddPerson(new Person());
}
}
[ValidationAspect(typeof(PersonValidation),Priority =0)]
//[CacheRemoveAspect(pattern: "*IPersonService*",Priority =2)]
public IResult AddPerson(Person person)
{
IResult result = BusinessRules.Run(
CheckIfPersonFullNameExists(person.PersonFirstName,person.PersonLastName));
if (result != null)
{
return result;
}
_personDal.Add(person);
return new SuccessResult(Messages.PersonAddedSuccess);
}
public abstract class MethodInterception : MethodInterceptionBaseAttribute
{
protected virtual void OnBefore(IInvocation invocation) { }
protected virtual void OnAfter(IInvocation invocation) { }
protected virtual void OnException(IInvocation invocation,System.Exception e) { }
protected virtual void OnSuccess(IInvocation invocation) { }
public override void Intercept(IInvocation invocation)
{
var isSuccess = true;
OnBefore(invocation);
try
{
invocation.Proceed();
}
catch (Exception e)
{
isSuccess = false;
OnException(invocation,e);
throw;
}
finally
{
if (isSuccess)
{
OnSuccess(invocation);
}
}
OnAfter(invocation);
}
}
[AttributeUsage(AttributeTargets.Class|AttributeTargets.Method,AllowMultiple =true,Inherited =true)]
public abstract class MethodInterceptionBaseAttribute:Attribute,IInterceptor
{
public int Priority { get; set; }
public virtual void Intercept(IInvocation invocation)
{
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。