7

単体テストを DRY しようとして、AutoFixture を IoC コンテナーとして使用して、テスト対象のシステム (SUT) をインスタンス化しようとしています。この特定Controllerのケースでは ASP.NET MVC です。したがって、AutoFixture をカスタマイズして、自動プロパティのないコントローラーを作成したいと考えています。

のカスタマイズを追加しようとしましたControllerBaseが、 のサブクラスでは機能しないようですControllerBase

fixture.Customize<ControllerBase>(c => c.OmitAutoProperties());

書きたいテストの例を次に示します。

    [Theory, AutoFixtureData]
    public void ControllerTest(AccountController controller) {
        Assert.Equal(default(UrlHelper), controller.Url);
    }

当然のことながら、プロジェクト内の特定のコントローラーごとに 1 つのカスタマイズを手動で追加すれば機能しますが、誰がそれをしたいでしょうか? より良い方法はありますか?

4

1 に答える 1

8

次のカスタマイズは上記のテストに合格し、あなたが求めているように見えます

public class MvcCostumization : ICustomization
{
    public void Customize(IFixture fixture)
    {
        fixture.Customizations.Add(
            new FilteringSpecimenBuilder(
                new MethodInvoker(new ModestConstructorQuery()),
                new ControllerSpecification()));
    }

    private class ControllerSpecification : IRequestSpecification
    {
        public bool IsSatisfiedBy(object request)
        {
            var t = request as Type;
            if (t == null)
                return false;

            return typeof(ControllerBase).IsAssignableFrom(t);
        }
    }
}

ただし、、、、、、などを含むすべてのMVC コントローラーのすべてのプロパティを無効にします。単体テストでそれらが必要になる場合があります。それを実行してもよろしいですか?UserHttpContextModelStateRequestResponse

MVC 基底クラスが 1 つの巨大な SRP 違反であることに同意するのは私が初めてですが、Controllerこれは私たちに与えられたクラスであるため、それを最大限に活用する以外に私たちにできることはありません。

通常、AutoFixture がほとんどのプロパティを自動的に満たすようにするには、少しひねるだけで済みます。

MVC 3 プロジェクトでは、これをAutoMoq 拡張機能と組み合わせると、 Controller インスタンスを作成するのに十分です。

fixture.Customize<ModelBindingContext>(c => c
    .Without(x => x.Model)
    .Without(x => x.ModelType));
fixture.Inject(CultureInfo.CurrentCulture);
于 2012-12-14T08:50:18.447 に答える