2

私はここで同様の問題を扱っているいくつかの質問を見てきましたが、どれも私を助けてくれませんでした。

MVC3プロジェクトでVS2010でNUnitを使用しています。私はテストプロジェクトを持っており、最初のテストEvarを書いています!:-)

私がついにそれに到達したことを誇りに思いませんか?!

これが私が得ているエラーです

Microsoft.Practices.ServiceLocation.ActivationException:データベースタイプのインスタンスを取得しようとしたときにアクティブ化エラーが発生しました。キー "MyConnection" ----> Microsoft.Practices.Unity.ResolutionFailedException:依存関係の解決に失敗しました。タイプ="Microsoft.Practices。 EnterpriseLibrary.Data.Database "、name="MyConnection"。例外が発生しました:解決中。例外は次のとおりです。InvalidOperationException-タイプデータベースを構築できません。この値を提供するようにコンテナを構成する必要があります。

私はweb.configこれらすべてを使用して構成しましたが、テストで実行されていない場合はデータが完全に返されるため、構成ごとに停止しているのではなく、NUnitで使用すると停止しているだけです。

これが私の接続情報です:

<section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data, Version=5.0.505.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="true" />
...
<dataConfiguration defaultDatabase="MyConnection" />
<connectionStrings>
<add name="MyConnection" connectionString="Data Source=MyServerName;Initial Catalog=MyDB;user id=MyUser;password=MyPassword"
  providerName="System.Data.SqlClient" />
</connectionStrings>

NuGetを使用してDaaBをインストールし、クリーンな手動リファレンスも実行しました。いずれにせよ、データは通常の使用では正常にロードされますが、テストでは次の行で停止します。

var database = DatabaseFactory.CreateDatabase("MyConnection");

この方法では

public IEnumerable<SchoolSearchResultsDTO> Find(SchoolSearchInputDTO dto) {
    List<SchoolSearchResultsDTO> fullList;
    var database = DatabaseFactory.CreateDatabase("MyConnection");
    using (var command = database.GetStoredProcCommand("dbo.usp_School_SearchBySchoolName")) {
        database.AddInParameter(command, "@I_strSchoolName", DbType.String, dto.SearchTerm);
        database.AddInParameter(command, "@I_intNumberOfRecords", DbType.Int32, dto.MaxSearchResults);
        using (var reader = database.ExecuteReader(command)) {
            fullList = new List<SchoolSearchResultsDTO>();
            while (reader.Read()) {
                var fullRecord = new SchoolSearchResultsDTO();
                fullRecord.SchoolID = reader.GetInteger("SchoolId");
                fullRecord.SchoolName = reader.GetString("SchoolName");
                fullRecord.IsDetailedDisplayMode = reader.GetBoolean("IsDetailedDisplayMode");
                fullList.Add(fullRecord);
            }
            reader.Close();
        }
    }
    return fullList;
}

他のすべての投稿では、構成の誤りなどについて説明しています。正しく構成されていると確信しています。そうしないと、通常の使用ではデータを取得できません。つまり、NUnitとDaaBが一緒に関係しているのです。

明るいアイデアはありますか?:-) 皆さんありがとう!

4

2 に答える 2

4

依存関係のモックに関して@Jesseに同意します。sutを分離していない場合は、単体テストではありません。(Art of UnitTestingを読むことをお勧めします)

それで、そこから先に進むと、統合テストを書いていると言えます。

正確な設定を見ないと、問題が何であるかを判断するのは困難です。あなたが言及したことの1つは、「を構成したweb.config」ということです。

しかし、テストプロジェクトで構成ファイルを設定しましたか?構成は、MVCプロジェクトではなく、単体テストプロジェクトからロードされます。

于 2012-06-07T00:49:25.697 に答える
2

一般に、単体テスト内でデータベースに直接アクセスすることは避けてください。価値のある信頼できる単体テストの作成に関して、モックについて読むために、いつか取っておくことをお勧めします。モックを使用すると、関連するコントローラーにモックされたサービスレイヤーを挿入できます。これは、予想されるデータベースデータを返すように設定されます。

テスト内で、そのサービスレイヤーのモックを作成します。moq(私のモックフレームワーク設定)を利用する例:

// create your expected data
var YourExpectedData = new IList<SchoolSearchResultsDTO>();

// .... add your expected information

//create & setup mock
var _service = new Mock<IYourService>();
_service.Setup(service => service.Find(It.IsAny<SchoolSearchInputDTO>())).Returns(YourExpectedData);

// create your controller
var controller = new YourCountroller(_service.object())

この時点から、ユニットテストは非常に簡単です。さまざまなコード内でメソッドfindが呼び出されるたびに、モックのテストが開始され、期待されるデータが返されます。

于 2012-06-06T23:01:00.357 に答える