4

TDD を使用して大部分が作成される新しい MVC アプリケーションの開発を開始しています。完全に接続されたアプリケーション (IOC には StructureMap を使用し、永続化には NHibernate を使用しています) が期待どおりに動作することを確認するために、いくつかの統合テストを追加したいと思います。

私は Selenium でいくつかの機能スモーク テストを作成するつもりですが、保守性の理由から、古き良き C# を使用してコントローラーでアクションを直接呼び出すことにより、ほとんどの統合テストを行うことをお勧めします。

これをどのように達成するかについてのガイダンスは驚くほど少ないので、私は攻撃の計画を突き刺しました

  1. すべてのブートストラップ コードを Global.asax から別のクラスにプルします。
  2. MvcContrib-TestHelper などを利用して、ASP.NET の依存関係 (コンテキスト、要求など) を作成しようとします。

ステップ 1 は完了しましたが、ステップ 2 に進む方法がまったくわかりません。アドバイスをいただければ幸いです。

public class Bootstrapper
{              
    public static void Bootstrap()
    {
        DependencyResolverInitializer.Initialize();
        FilterConfig.RegisterFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        ModelBinders.Binders.DefaultBinder = new SharpModelBinder();
    }           
}

public class DependencyResolverInitializer
{
    public static Container Initialize()
    {
        var container = new Container();
        container.Configure(x => x.Scan(y =>
        {
            y.Assembly(typeof(Webmin.UI.FilterConfig).Assembly);
            y.WithDefaultConventions();
            y.LookForRegistries();

        }));

        DependencyResolver.SetResolver(new StructureMapDependencyResolver(container));
        return container;
    }
}

public class StructureMapDependencyResolver : IDependencyResolver
{
    private readonly IContainer _container;

    public StructureMapDependencyResolver(IContainer container)
    {
        _container = container;
    }

    public object GetService(Type serviceType)
    {
        if (serviceType.IsAbstract || serviceType.IsInterface) {
            return _container.TryGetInstance(serviceType);
        }
        return _container.GetInstance(serviceType);
    }

    public IEnumerable<object> GetServices(Type serviceType)
    {
        return _container.GetAllInstances(serviceType).Cast<object>();
    }
}
4

1 に答える 1

5

UIを経由せずにASP.NETMVCアプリケーションの自動エンドツーエンドテストを実行する場合、それを実行する1つの良い方法は、プログラムでHTTP要求をさまざまなURLに送信し、後でシステムの状態をアサートすることです。

統合テストは基本的に次のようになります。

  1. 配置:テスト対象のWebアプリケーションをホストするWebサーバーを起動します
  2. 動作:特定のURLにHTTPリクエストを送信します。これは、コントローラーアクションによって処理されます。
  3. アサート:システムの状態を確認する(たとえば、特定のデータベースレコードを探す)か、応答の内容を確認する(たとえば、返されたHTMLで特定の文字列を探す)

CassiniDevを使用して、インプロセスWebサーバーでASP.NETWebアプリを簡単にホストできます。また、プログラムでHTTP要求を送信する便利な方法の1つは、Microsoft ASP.NETWebAPIクライアントライブラリを使用することです。

次に例を示します。

[TestFixture]
public class When_retrieving_a_customer
{
    private CassiniDevServer server;
    private HttpClient client;

    [SetUp]        
    public void Init()
    {
        // Arrange
        server = new CassiniDevServer();
        server.StartServer("..\relative\path\to\webapp", 80, "/", "localhost");
        client = new HttpClient { BaseAddress = "http://localhost" };
    }

    [TearDown]
    public void Cleanup()
    {
        server.StopServer();
        server.Dispose();
    }

    [Test]
    public void Should_return_a_view_containing_the_specified_customer_id()
    {
        // Act
        var response = client.GetAsync("customers/123").Result;

        // Assert
        Assert.Contains("123", response.Content.ReadAsStringAsync().Result);
    }
}

この手法の実際のより完全な例を探している場合は、私のサンプルMVC 4 Webアプリケーションで見つけることができます。ここでは、自動受け入れテストを作成するコンテキストでそれを示しました。

于 2013-02-12T09:59:58.770 に答える