微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

单元测试未按预期响应

如何解决单元测试未按预期响应

我在我的项目中使用了 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?