2

n 層 Web アプリ用に多数の MS Visual Studio 単体テストを作成しようとしていますが、何らかの理由でこれらのテストを実行できず、次のエラーが発生します -

"オブジェクト参照がオブジェクト インスタンスに設定されていません"

私がやろうとしているのは、LINQ データ コンテキスト クラスを使用して特定の関数を実行し、結果を返すデータ アクセス レイヤーをテストすることですが、デバッグ プロセス中に、すべてのテストが到達するとすぐに失敗することがわかりました。 LINQデータコンテキストクラスであり、接続文字列と関係がありますが、何が問題なのかわかりません。

テストのデバッグはここで失敗します (2 行目):

public EICDataClassesDataContext() :
    base(global::System.Configuration.ConfigurationManager.ConnectionStrings["EICDatabaseConnectionString"].ConnectionString, mappingSource)
    {
        OnCreated();
    }

そして、私のテストは次のとおりです。

TestMethod()]
    public void OnGetCustomerIDTest()
    {
        FrontLineStaffDataAccess target = new FrontLineStaffDataAccess(); // TODO: Initialize to an appropriate value
        string regNo = "jonh"; // TODO: Initialize to an appropriate value
        int expected = 10; // TODO: Initialize to an appropriate value
        int actual;
        actual = target.OnGetCustomerID(regNo);
        Assert.AreEqual(expected, actual);
    }

DAL から呼び出すメソッドは次のとおりです。

 public int OnGetCustomerID(string regNo)
    {
        using (LINQDataAccess.EICDataClassesDataContext dataContext = new LINQDataAccess.EICDataClassesDataContext())
        {
            IEnumerable<LINQDataAccess.GetCustomerIDResult> sProcCustomerIDResult = dataContext.GetCustomerID(regNo);
            int customerID = sProcCustomerIDResult.First().CustomerID;

            return customerID;
        }
    }

したがって、DAレイヤーメソッドの1行目に到達した後、LINQデータアクセスクラスをインスタンス化しようとすると、基本的にすべてが失敗します...

問題のトラブルシューティングに約 10 時間費やしましたが、結果は得られませんでした...助けていただければ幸いです。

更新: 最後にこれを修正しました!!!!:) 理由はわかりませんが、 app.config ファイルのいくつかの理由により、データベースへの接続は次のようになりました。

AttachDbFilename=|データディレクトリ|\EICDatabase.MDF

だから私がしたことは、パスを変更しただけで、 |DataDirectory| の代わりに MDF ファイルが置かれている実際のパスを入力します。

C:\Users\1\Documents\Visual Studio 2008\Projects\EICWebSystem\EICWebSystem\App_Data\EICDatabase.mdf

私がそれを行った後、それはうまくいきました!しかし、まだ何が問題なのか少しはっきりしていません...おそらくデータベースへのパスが間違っていますか? ASP.NET プロジェクトの web.config には |DataDirectory|\EICDatabase.MDF パスが含まれています..

4

3 に答える 3

2

LINQDataAccess.EICDataClassesDataContextセットアップのために web.config またはその他の外部データ ソースを参照していますか?

web.configテスト コードにアクセスするには、さまざまな手順を踏まなければならないという事実をお伝えできます。

更新 ああ、はい。ConfigurationManagerテストが失敗した行で 使用していることがわかります...ConfigurationManager構成のためにweb.configを調べます。これは、私がテストを書くときの難点でした。

クラスが web.config なしでインスタンス化できるようにコードを変更するか、テストが web.config にアクセスできるようにする必要があります。

于 2010-05-25T14:54:30.833 に答える
2

テスト プロジェクトには独自の構成ファイルがありますか? 通常、この種の動作は、アプリが接続文字列を見つけられないことを意味します。テスト プロジェクトは、クライアント アプリのコンテキストで実行されていないため、独自のファイルが必要です。

更新app.configを追加した後に説明するエラーは、SQLExpressで構築されたWebアプリケーションをテストし、.mdfを添付するときに一般的です。SQLExpress は、一度に複数のプロセスで実行することはできません。そのため、以前に Web アプリケーションを実行したことがある場合は、まだアクティブであり、データベースを接続しようとすると競合する可能性があります。

SQL Management Studio を使用してデータベースを永続的に接続し、次のような従来の接続文字列を使用できます。

Server=myServer;Database=EICDatabase;Trusted_Connection=True;
于 2010-05-25T14:55:53.617 に答える
0

私にとっては、あなたの問題は設定されていない接続文字列にあるようです。あなたの単体テストは、DAL とは別のプロジェクトにあると思います。接続文字列を指定せずに datacontext コンストラクターで 'new' コマンドを呼び出します。したがって、通常、設定されている場合はデフォルトを使用する必要があります。ただし、この設定は通常、他のプロジェクトの web.config に保存されるため、接続文字列が設定されておらず、エラーが発生します。

正しい場合、私が想定しているように、DALプロジェクトからユニットテストプロジェクトに設定を取得する必要があります。最も簡単な解決策は、web.config 接続文字列を単体テスト プロジェクトの app.config にコピーすることです。

確かに他にも可能性はありますが、web.config 構成を単体テスト プロジェクトに組み込むのは簡単ではないと思います。

于 2010-05-25T14:53:29.517 に答える