ServiceStack验证程序未触发

时间:2017-01-08 20:45:50

标签: validation servicestack

我正在尝试在ServiceStack中使用流畅的验证。我添加了验证插件并注册了我的验证器。

    Plugins.Add(new ValidationFeature());
    container.RegisterValidators(typeof(CreateLeaveValidator).Assembly);

我已经为我的服务模型实现了验证器类:

public class CreateLeaveValidator : AbstractValidator<CreateLeave>
{
    public CreateLeaveValidator()
    {
        RuleFor(cl => cl.StudentId).NotEmpty();
        RuleFor(cl => cl.LeaveDepart).NotEmpty().GreaterThan(DateTime.Now).WithMessage("Leave must begin AFTER current time and date.");
        RuleFor(cl => cl.LeaveReturn).NotEmpty().GreaterThan(cl => cl.LeaveDepart).WithMessage("Leave must end AFTER it begins.");
        RuleFor(cl => cl.ApprovalStatus).Must( status => ( ("P".Equals(status)) || ("C".Equals(status)) || ("A".Equals(status)) || ("D".Equals(status)) ) );
    }
}

服务模式:

   [Route("/leaves", "POST")]
    public class CreateLeave : IReturn<LeaveResponse>, IUpdateApprovalStatus
    {
        public int StudentId { get; set; }
        public DateTime RequestDate { get; set; }
        public DateTime LeaveDepart { get; set; }
        public DateTime LeaveReturn { get; set; }
        public string Destination { get; set; }
        public string HostRelationship { get; set; }
        public string Address { get; set; }
        public string City { get; set; }
        public string State { get; set; }
        public string Postal { get; set; }
        public string Hostphone { get; set; }
        public string Cellphone { get; set; }
        public string Transport { get; set; }
        public string Driver { get; set; }
        public string Companions { get; set; }
        public string Reason { get; set; }
        public string ApprovalStatus { get; set; }
        public DateTime ApprovalDate { get; set; }
        public string ApprovalComment { get; set; }
        public string ApprovalReason { get; set; }
        public int ApprovalUser { get; set; }
    }

但是当我创建一个没有StudentId或无效的ApprovalStatus的请求时,验证器似乎不会触发并捕获无效的请求。

如何解决原因?

更新:更正它似乎验证器正在使用我的实际服务,但不在我的单元测试中。我猜我不能在单元测试设置中正确配置我的apphost。这是我的测试构造函数:

public LeaveTests()
    {
        Licensing.RegisterLicense(@"[license key]");

        appHost = new BasicAppHost(typeof(ApiServices).Assembly).Init();
        ServiceStack.Text.JsConfig.DateHandler = ServiceStack.Text.DateHandler.ISO8601;
        appHost.Plugins.Add(new ValidationFeature());            
         appHost.Container.RegisterValidators(typeof(CreateLeaveValidator).Assembly);

    }

1 个答案:

答案 0 :(得分:4)

ServiceStack验证过滤器在Global Request Filter中执行,需要full integration test才能运行,例如:

public class MyIntegrationTests
{
    ServiceStackHost appHost;
    public MyIntegrationTests()
    {
        appHost = new AppHost()
            .Init()
            .Start("http://localhost:8000/");
    }

    [OneTimeTearDown] void OneTimeTearDown() => appHost.Dispose();

    [Test]
    public void Execute_validation_filters()
    {
        var client = new JsonServiceClient("http://localhost:8000/");

        try
        {
            var response = client.Post(new CreateLeave { ... });
        }
        catch(WebServiceException ex) 
        {
            //...
        }
    }
}