gpt4 book ai didi

c# - 需要为 ApiControllers 创建约定

转载 作者:太空狗 更新时间:2023-10-29 17:50:44 25 4
gpt4 key购买 nike

我在测试中有一组有效的命令式代码,我正试图将其归结为基本的测试约定。

我的测试如下所示:

[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);
}

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

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;
}
}

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

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

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

最佳答案

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

网络 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())));
}
}

由于自动属性在默认情况下处于启用状态,因此这会将适当的 HttpRequestMessage 实例分配给 ApiController.Request。连同 Auto-mocking自定义,Fixture 现在可以创建所有 ApiController 类的实例。

网络 API 2

使用 ASP.NET Web API 2 (5.0.0.0) 时,事情稍微复杂一些,但经过反复试验,我得到了通过 808 测试的自定义:

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));
}
}

约定

如果将其打包到 [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);
}

关于c# - 需要为 ApiControllers 创建约定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20712686/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com