需要为ApiControllers创建约定

我在测试中有一组工作命令性代码,我试图将其归结为一个基本的测试约定。

我的测试如下所示:

[Theory, BasicConventions] public void GetVersionOnSiteVersionControllerReturnsASiteVersion(IFixture fixture) { fixture.OmitAutoProperties = true; SiteVersion expected = fixture.Create(); SiteVersion actual = null; var sut = fixture.Create(); var response = sut .GetSiteVersion() .ExecuteAsync(new CancellationToken()) .Result .TryGetContentValue(out actual); actual.AsSource().OfLikeness().ShouldEqual(expected); } 

我还有一个允许它工作的自定义,即通过将HttpConfigurationHttpRequestMessage设置为默认的非空值。

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

首先,这看起来很难看,但是如果我使用Build ()。omit()。with(config).with(request),它会关闭构建这些实例所需的automoq自定义。

其次,这仅适用于SiteVersionController。 对于我所有的ApiControllers,我更倾向于概括一下(也许这是一个坏主意,但在我尝试之前我不会知道)。

基本上我的约定如下: 对于所有ApiControllers,创建它们没有自动属性但是将http配置和请求消息属性设置为默认的非空值

ApiControllers很难接线,因为您需要为它们分配某些属性才能使一切工作。 至少,您需要分配Request属性,否则Controller不能调用Request.CreateResponse 。 因此,关闭ApiController实例的自动属性不是一个好策略。 相反,您可以配置AutoFixture以正确连接HttpRequestMessage实例。

Web API 1

使用ASP.NET Web API 1,我通常使用这样的自定义:

 public class WebApiCustomization : ICustomization { public void Customize(IFixture fixture) { fixture.Customize(c => c .Do(x => x.Properties.Add( HttpPropertyKeys.HttpConfigurationKey, new HttpConfiguration()))); } } 

由于默认情况下自动属性处于启用状态,因此将为ApiController.Request分配适当的HttpRequestMessage实例。 与自动模拟自定义一起, Fixture现在可以创建所有ApiController类的实例。

Web API 2

使用ASP.NET Web API 2(5.0.0.0),事情有点复杂,但是经过一些试验和错误,我得到了这个Customization来传递808个测试:

 public class WebApiCustomization : ICustomization { public void Customize(IFixture fixture) { fixture.Customize(c => c .OmitAutoProperties()); fixture.Customize(c => c .Do(x => x.Properties.Add( HttpPropertyKeys.HttpConfigurationKey, fixture.Create()))); fixture.Customize(c => c .Without(x => x.ClientCertificate)); } } 

约定

如果将其打包到[AutoData]属性中,您应该能够将测试重构为:

 [Theory, BasicConventions] public void GetVersionOnSiteVersionControllerReturnsASiteVersion( SiteVersionController sut, SiteVersion expected) { SiteVersion actual = null; var response = sut .GetSiteVersion() .ExecuteAsync(new CancellationToken()) .Result .TryGetContentValue(out actual); actual.AsSource().OfLikeness().ShouldEqual(expected); }