Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 需要为APIController创建约定_C#_Autofixture - Fatal编程技术网

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