2

組み込みの ASP.NET ユニット テスト フレームワークに不満を感じている人はいますか? 私が抱えている問題は、MVC3 アプリケーションで ASP.NET のメンバーシップ プロバイダーに接続してテストすることです。データベース接続が確立されていないか、アプリケーションを正常に実行したときとは異なるルール セットが設定されているようです。ここに 2 つのシナリオがあります。

1) 既存のユーザーを名前で検索しようとしています:

単体テスト -

    [TestMethod]
    public void RegisterTest()
    {
        AccountController target = new AccountController(); 
        RegisterModel model = new RegisterModel() { UserName = "existinguser", Email = "email@test.com", Password = "Password", ConfirmPassword = "Password" };
        actual = target.Register(model);
    }

AccountController からのコード チャンク -

            MembershipCreateStatus createStatus;
            MembershipUserCollection members = Membership.FindUsersByName(model.UserName);
            MembershipUser user = null;
            if (members.Count > 0)
                createStatus = MembershipCreateStatus.DuplicateUserName;

結果 - このコードにステップインすると、このユーザーがシステム内にいることがわかっているにもかかわらず、メンバー配列が空です。単体テスト アプリケーションでメンバーシップ ストアへの接続を確立するためのトリックはありますか? datasource 属性を使用しようとしましたが、成功しませんでした。

2) 新しいメンバーシップ アカウントを作成しようとしています: 単体テストは上記と同じですが、まだシステムにない新しいユーザーを渡しています。コントローラーにステップインして次の行に到達すると、「InvalidQuestion」のmembershipCreateStatusが表示されます。これは奇妙に思えます。なぜなら、このライブを実行するときはその問題はなく、このままの回線でアカウントを作成できるからです。

user = Membership.CreateUser(model.UserName, model.Password, model.Email, string.Empty, string.Empty, true, null, out createStatus);

よろしくお願いします。私は実際にこのテストを最初に実行しようとしていますが、組み込みのテスト フレームワークを使用するのが難しくなっています。確かに、すべての単体テストの DB に接続し (各テストに接続を提供するのではなく)、ブラウザーを介して行うのと同じアクションをシミュレートする方法があります。

4

2 に答える 2

3

単体テストを実行すると、新しいアプリケーションとして効果的に実行されるため、独自の構成ファイルを使用します。つまり、MVC アプリが使用する web.config ではありません。したがって、詳細情報なしで不足していると思われるのは、メンバーシップ情報を保持するデータベースへの接続文字列のための、テスト プロジェクトの app.config ファイルのエントリです (app.config も不足している可能性があります)。

TDD アプローチを採用しようとしている場合は、単体テストを作成する必要があります。単体テストを実行するためにデータベースに接続する必要がある場合は、おそらく単体テストではなく統合テストです。メンバーシップ クラスは静的メソッドを使用するため、これが困難になります。私がお勧めするのは、メンバーシップ機能を独自のサービスに対応するインターフェイス (たとえば IMembershipService ) でラップし、IoC コンテナーによって挿入できるようにすることです。単体テストのために、データベースに接続する必要なく、作成した IMembershipService インターフェイスを単純にモックできます。

于 2011-10-19T12:20:51.333 に答える
2

私も同じ問題を抱えていました。はい、私の単体テストは統合テストに似ているように見えますが、コントローラーをテストする必要があり、プロジェクトのこの時点では速度は問題ではありませんでした。基本的に、MVC 3 プロジェクトの web.config からすべての sql メンバーシップ構成と接続文字列を追加して、プロジェクトの app.config をテストし、単体テストの実行時にメンバーシップ プロバイダーが機能しました。以下は、私のテスト プロジェクトの app.config 全体です。

<?xml version="1.0" encoding="utf-8"?>
<!-- 
    Note: Add entries to the App.config file for configuration settings
    that apply only to the Test project.
-->
<configuration>
  <appSettings></appSettings>
  <connectionStrings>
    <add name="ApplicationServices" connectionString="mySqlServer;initial catalog=mySqlMembershipDB;persist security info=True;user id=mySqlUser;password=mySqlPassword;" providerName="System.Data.SqlClient" />
  </connectionStrings>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.0.5.0" newVersion="4.0.5.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>

  <system.web>
    <membership defaultProvider="AspNetSqlMembershipProvider">
      <providers>
        <clear />
        <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="ApplicationServices" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="true" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/" />
      </providers>
    </membership>
    <profile defaultProvider="AspNetSqlProfileProvider">
      <providers>
        <clear />
        <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="ApplicationServices" applicationName="/" />
      </providers>
    </profile>
    <roleManager enabled="false" defaultProvider="AspNetSqlRoleProvider">
      <providers>
        <clear />
        <add name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="ApplicationServices" applicationName="/" />
      </providers>
    </roleManager>
  </system.web>
</configuration>
于 2012-01-07T16:38:38.197 に答える