0

I am trying to verify that data coming in the Detail property of an AWS ScheduledEvent object is correct. The information should be coming in from EventBridge with JSON in the Detail property that matches this class:

public class EventBatchData
{
    public int BatchSize { get; private set; }
    public int BatchRetries { get; private set; }

    public EventBatchData(int batchSize, int batchRetries)
    {
        BatchSize = batchSize;
        BatchRetries = batchRetries;

        var validator = new EventBatchDataValidator();
        validator.ValidateAndThrow(this);
    }
}

I have a FluentValidation validator in the class so it cannot be created in an invalid state.

However, I am not able to set the SceduledEvent.Detail property, either directly or as an expectation through a mocking library. The Detail property is defined with type T so I even tried using dynamic but that fails:

[Theory]
    [AutoFakeItEasyData]
    public void NotThrowError_WhenDetailIsValid(EventBatchData eventBatchData)
    {
        //Arrange
        dynamic expectedDetail = new ExpandoObject();
        expectedDetail.BatchRetries = eventBatchData.BatchRetries;
        expectedDetail.BatchSize = eventBatchData.BatchSize;

        var scheduledEvent = new ScheduledEvent
        {
            Account = "testAccount",
            Region = "testRegion",
            DetailType = "Scheduled Event",
            Source = "aws.events",
            Time = DateTime.UtcNow,
            Id = "cdc73f9d-aea9-11e3-9d5a-835b769c0d9c",
            Resources = new List<string> { "resource1", "resource2" },
            Detail = expectedDetail
        };

        //Act
        var result = _validator.TestValidate(scheduledEvent);

        //Assert
        result.ShouldHaveValidationErrorFor(x => x.Detail);
    }

Cannot implicitly convert type 'System.Dynamic.ExpandoObject' to 'Amazon.Lambda.CloudWatchEvents.ScheduledEvents.Detail'

1 Answer 1

1

The ScheduledEvent class actually inherits from the CloudWatchEvent<Amazon.Lambda.CloudWatchEvents.ScheduledEvents.Detail> class, so the Details field is not a generic data type; instead, it is type of Amazon.Lambda.CloudWatchEvents.ScheduledEvents.Detail class.

Hence, you cannot use the dynamic data type for the Details field; instead, convert the EventBatchData class to the Details data type, and it should work.

public class EventBatchData : Amazon.Lambda.CloudWatchEvents.ScheduledEvents.Detail 
{
    public int BatchSize { get; private set; }
    public int BatchRetries { get; private set; }

    public EventBatchData(int batchSize, int batchRetries)
    {
        BatchSize = batchSize;
        BatchRetries = batchRetries;

        var validator = new EventBatchDataValidator();
        validator.ValidateAndThrow(this);
    }
}
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.