0

ASP.NET MVC を使用して、VS2012 Web Express のテスト プロジェクトを使用してヘルパー メソッドをテストしようとしています。通常のデータベースをテストに使用したくないので、次の App.Config をテスト プロジェクトに追加しました。

<connectionStrings>
     <add name="MyConnection" connectionString="Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\UnitTest.mdf;Integrated Security=True" providerName="System.Data.SqlClient" />
</connectionStrings>

Unittest のセットアップは次のようになります。

[TestMethod]
public void TestSomething()
{
    MyDatabase db = new MyDatabase();

    //Initialize objects and save them in the (test) database

    db.SaveChanges();

    //Initializing the class that contains the method I want to test
    TestUserClass tuc= new TestUserClass();

    //Calling the method I want to test
    tuc.TestUserMethod (1, 1);

    //Check the database if everything is correct
}

これは正常に機能しています。テスト データベースを使用しており、すべての正しいオブジェクトが作成されています。ただし、テストしたいメソッドを含むクラスを初期化すると問題が発生します。TestUserClass もデータベースを使用するため、このようなデータベースも初期化します

//In the class TestUserClass 
MyDatabase db = new MyDatabase();

MyDatabase クラスは次のようになります。

public class MyDatabase : DbContext
{
    public MyDatabase()
        : base("MyConnection")
    {
        Database.SetInitializer<MyDatabase>(new DropCreateDatabaseIfModelChanges<MyDatabase>());
    }

    public DbSet<UserGroup> UserGroups { get; set; }
}

テストしたいクラスを初期化するとすぐに問題が発生します。その前に、私の db オブジェクトにはすべての適切なオブジェクトが含まれていましたが、TestUserClass を初期化して別の MyDatabase オブジェクトを作成した後、db オブジェクトには何も含まれていません (すべての適切なセットがそこにあり、それらは空です)。

問題は、MyDatabase オブジェクトを再度初期化することだと思います (明らかに?)。しかし、この問題を解決する方法がわかりません。アプリケーションの設計、単体テストに問題があるのでしょうか、それとも、データベースを初期化せずにオブジェクトをリセットせずに使用できるようにする、ばかげた小さなコードが不足しているだけなのでしょうか?

よろしくお願いします!

アンドレアス

4

1 に答える 1

0

私自身の質問に答えるために(実際にどのように機能するのかわかりません、試行錯誤FTW)。オーバーロードされたコンストラクターを TestUserClass に追加しました。

public UserManagement()
{
   db = new RefusionsDatabase();
}

public UserManagement(RefusionsDatabase dbIn)
{
   db = dbIn;
}

そして、TestUserClass の初期化を MyDatabase の初期化の直後に移動しました (なぜこれが必要なのかはわかりませんが、そうでした)。

MyDatabase db = new MyDatabase();
TestUserClass tuc= new TestUserClass(db);

そして今、それは機能します。

それが誰かに役立つことを願っています

アンドレアス

PS: 誰かがこれが機能する理由を知っている場合、より良い解決策を知っている場合、またはデザインについてコメントがある場合は、説明がないと奇妙であるため、喜んでいます。

于 2013-06-07T20:26:21.007 に答える