Necesito crear convenciones para ApiControllers.

Tengo un conjunto de código imperativo de trabajo en prueba y estoy tratando de reducirlo a una convención de prueba esencial.

Mi prueba se parece a la siguiente:

[Theory, BasicConventions]
public void GetVersionOnSiteVersionControllerReturnsASiteVersion(IFixture fixture)
{
    fixture.OmitAutoProperties = true;
    SiteVersion expected = fixture.Create<SiteVersion>();
    SiteVersion actual = null;

    var sut = fixture.Create<SiteVersionController>();

    var response = sut
        .GetSiteVersion()
        .ExecuteAsync(new CancellationToken())
        .Result
        .TryGetContentValue<SiteVersion>(out actual);

    actual.AsSource().OfLikeness<SiteVersion>().ShouldEqual(expected);
}

También tengo una personalización que permite que esto funcione, a saber, configurando elHttpConfiguration yHttpRequestMessage para por defecto valores no nulos.

public class ApiControllerCustomization : ICustomization
{
    public void Customize(IFixture fixture)
    {
        var origin = fixture.OmitAutoProperties;
        fixture.OmitAutoProperties = true;
        var sut = fixture.Create<SiteVersionController>();
        sut.Configuration = fixture.Create<HttpConfiguration>();
        sut.Request = fixture.Create<HttpRequestMessage>();
        fixture.Inject<SiteVersionController>(sut);
        fixture.OmitAutoProperties = origin;
    }
}

Primero, esto parece feo, pero si uso Build <> (). Omit (). With (config) .with (request), cierra la personalización automática que necesita para construir esas instancias.

Segundo, esto solo funciona para un SiteVersionController. Preferiría generalizar esto para todos mis controladores de Api (tal vez sea una mala idea, pero no lo sabré hasta que lo intente).

Esencialmente mi convención sería la siguiente:para todos los ApiControllers, créalos sin propiedades automáticas, pero establezca la configuración http y solicite las propiedades del mensaje a valores no nulos predeterminados

Respuestas a la pregunta(1)

Su respuesta a la pregunta