C# 需要为APIController创建约定
我在测试中有一组有效的命令式代码,我试图将其归结为一个基本的测试约定 我的测试如下所示:C# 需要为APIController创建约定,c#,autofixture,C#,Autofixture,我在测试中有一组有效的命令式代码,我试图将其归结为一个基本的测试约定 我的测试如下所示: [Theory, BasicConventions] public void GetVersionOnSiteVersionControllerReturnsASiteVersion(IFixture fixture) { fixture.OmitAutoProperties = true; SiteVersion expected = fixture.Create<SiteVersi
[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);
}
首先,这看起来很难看,但是如果我使用Build().omit().with(config).with(request),它会关闭构建这些实例所需的automoq定制
其次,这只适用于SiteVersionController。我更愿意将其推广到我所有的apicontroller(也许这是个坏主意,但在我尝试之前我不会知道)
基本上,我的惯例如下:
对于所有APIController,在不使用自动属性的情况下创建它们,但一定要将http配置和请求消息属性设置为默认的非空值
APIController
很难连接,因为您需要为它们分配某些属性才能使一切正常工作。至少,您需要分配请求
属性,否则,控制器
无法调用请求.CreateResponse
。因此,关闭ApiController
实例的自动属性不是一个好策略。相反,您可以将AutoFixture配置为正确连接HttpRequestMessage
实例
Web API 1
对于ASP.NET Web API 1,我通常使用如下自定义项:
public class WebApiCustomization : ICustomization
{
public void Customize(IFixture fixture)
{
fixture.Customize<HttpRequestMessage>(c => c
.Do(x =>
x.Properties.Add(
HttpPropertyKeys.HttpConfigurationKey,
new HttpConfiguration())));
}
}
惯例
如果您将其打包到一个[AutoData]
属性中,您应该能够重构测试以:
[Theory, BasicConventions]
public void GetVersionOnSiteVersionControllerReturnsASiteVersion(
SiteVersionController sut,
SiteVersion expected)
{
SiteVersion actual = null;
var response = sut
.GetSiteVersion()
.ExecuteAsync(new CancellationToken())
.Result
.TryGetContentValue<SiteVersion>(out actual);
actual.AsSource().OfLikeness<SiteVersion>().ShouldEqual(expected);
}
[理论,基本惯例]
public void GetVersionOnInsiteVersionControllerReturnsSiteVersion(
SiteVersionController sut,
站点(预期版本)
{
SiteVersion实际值=null;
var响应=sut
.GetSiteVersion()
.ExecuteAsync(新的CancellationToken())
.结果
.TryGetContentValue(超出实际值);
likenness()的实际.AsSource()应等于(预期);
}
ApiController您使用的是哪种类型?ASP.NET Web API?哪个版本?我的NuGet软件包管理器说ASP.NET Web API版本5.0.0相关:这太棒了。问题,谢天谢地,我已经掌握了AutoFixture的窍门,我的大部分窍门都是试图连接这样的东西。你是如何着手研究这个策略的?或者仅仅是经验?好吧,就我个人而言,我写了AutoFixture,所以你可以说我在作弊:)我也邀请其他人回答这个问题。在F#中的ASP.NET Web API 2的相同定制可以在以下网站找到:
public class WebApiCustomization : ICustomization
{
public void Customize(IFixture fixture)
{
fixture.Customize<HttpConfiguration>(c => c
.OmitAutoProperties());
fixture.Customize<HttpRequestMessage>(c => c
.Do(x =>
x.Properties.Add(
HttpPropertyKeys.HttpConfigurationKey,
fixture.Create<HttpConfiguration>())));
fixture.Customize<HttpRequestContext>(c => c
.Without(x => x.ClientCertificate));
}
}
[Theory, BasicConventions]
public void GetVersionOnSiteVersionControllerReturnsASiteVersion(
SiteVersionController sut,
SiteVersion expected)
{
SiteVersion actual = null;
var response = sut
.GetSiteVersion()
.ExecuteAsync(new CancellationToken())
.Result
.TryGetContentValue<SiteVersion>(out actual);
actual.AsSource().OfLikeness<SiteVersion>().ShouldEqual(expected);
}