本文介绍了需要创建ApiControllers约定的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一组测试工作势在必行代码和我想熬下来到必要的测试约定

I have a set of working imperative code in test and I'm trying to boil it down to an essential test convention.

我的测试如下所示:

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



我也有一个自定义,让这项工作,即通过设置 HttpConfiguration HttpRequestMessage 默认非空值。

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



首先,这看起来难看,但如果我用构建和LT ;。>()省略()和(配置)。随着(请求),它关闭,它需要建立的情况下,automoq定制

First, this looks ugly, but if I use Build<>().omit().with(config).with(request), it shuts off the automoq customization which it needs to build those instances.

二,这仅适用于一个SiteVersionController。我宁愿这概括为我所有ApiControllers(也许这是一个坏主意,但我不知道,直到我试试)。

Second, this only works for a SiteVersionController. I'd much rather generalize this for all my ApiControllers (maybe that's a bad idea, but I won't know until I try).

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

Essentially my convention would be as follows:for all ApiControllers, create them without auto properties but do set the http configuration and request message properties to default non-null values

推荐答案

ApiControllers 是相当困难的线了,因为你需要为了某些属性分配给他们的一切工作。最起码,你需要在请求来分配财产,否则,在控制器不能调用 Request.CreateResponse 。因此,对于 ApiController 实例关闭自动性能不是一个好的策略。相反,你可以配置AutoFixture正确线了 HttpRequestMessage 实例。

ApiControllers are quite difficult to wire up, because you'll need to assign certain properties to them in order for everything to work. At the very least, you'll need the Request property to be assigned, because otherwise, the Controller can't invoke Request.CreateResponse. Thus, switching off auto-properties for ApiController instances isn't a good strategy. Instead, you can configure AutoFixture to wire up HttpRequestMessage instances correctly.

网络API 1

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

With ASP.NET Web API 1, I usually use a Customization like this:

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 。再加上一个定制,灯具现在可以创建你的所有 ApiController 类的实例。

Since auto-properties are on by default, this is going to assign an appropriate instance of HttpRequestMessage to ApiController.Request. Together with an Auto-mocking Customization, Fixture can now create instances of all your ApiController classes.

网络API 2

使用的ASP.NET Web API 2(5.0.0.0),事情有点复杂,但有一点试验和错误,我得到这个定制通过808测试:

With ASP.NET Web API 2 (5.0.0.0), things are a little more complicated, but with a bit of trial and error, I got this Customization to pass 808 tests:

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] 属性,你应该能够测试重构为:

If you package that into an [AutoData] attribute, you should be able to refactor your test to:

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

这篇关于需要创建ApiControllers约定的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-28 20:49