How to unit test a controller with XUnit, Moq and AutoFixture?
Asked Answered
C

1

-1

I have a controller with the following signature:

public CustomerTypeController(
    IHttpContextAccessor accessor,
    IPrincipalProvider provider,
    IMapper mapper, 
    ILogger<CustomerTypeController> logger,
    ICustomerTypeService customerTypeService)
{ }

I also set up an AutoDataAttribute:

public class AutoMoqDataAttribute : AutoDataAttribute
{
    public AutoMoqDataAttribute()
        : base(() => 
        {
            var fixture = new Fixture().Customize(new CompositeCustomization(
                new AutoMoqCustomization(),
                new SupportMutableValueTypesCustomization()));

            fixture.Behaviors.OfType<ThrowingRecursionBehavior>()
                .ToList()
                .ForEach(x => fixture.Behaviors.Remove(x));

            fixture.Behaviors.Add(new OmitOnRecursionBehavior());

            return fixture;
        })
    { }
}

For now my Theory looks like this:

[Theory, AutoMoqData]
public void GetWhenHasCustomerTypesShouldReturnOneCustomerType(
    IFixture fixture,
    [Frozen] Mock<ICustomerTypeService> service,
    CustomerTypeController sut)
{
    //Arrange
    var items = fixture.CreateMany<Model.CustomerType>(3).ToList();

    //Act
    var result = sut.Get(1);

    //Assert
    Assert.IsType<OkResult>(result);
}

Do I need to setup the service with the items before getting an item from the controller? If yes, how is the service set up?

Chanukah answered 30/10, 2020 at 2:56 Comment(0)
P
2

Use the [NoAutoProperties] attribute to decorate the controller parameter in the test method.

Refer to this answer for details.

Peart answered 12/11, 2020 at 20:23 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.