需要为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); }
我还有一个允许它工作的自定义,即通过将HttpConfiguration
和HttpRequestMessage
设置为默认的非空值。
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); }