ServiceStack validators do not work

I am trying to use free check in ServiceStack. I added a validation plugin and registered my validator.

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

I applied a validation class to my service model:

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)) ) );
    }
}

Service Model:

   [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; }
    }

But when I create a request without StudentId or an invalid CertificateStatus, the validator does not seem to work and does not look for an invalid request.

How can I find the reason for this?

UPDATE: Bugfix: it seems that validators work with my actual service, but not in my unit tests. I assume that I should not properly configure my apphost in the unit test setup. Here is my test constructor:

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);

    }
+4
source share
1 answer

ServiceStack , , :

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) 
        {
            //...
        }
    }
}
+4

Source: https://habr.com/ru/post/1666181/


All Articles