单元测试未按预期响应

时间:2021-01-23 20:40:00

标签: c# fluentvalidation castle-dynamicproxy

我在我的项目中使用了 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)
        {
          
        }
    }

0 个答案:

没有答案
相关问题