質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.51%

  • C#

    7147questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • SQL Server

    591questions

    SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

  • ユニットテスト

    35questions

    ユニットテストは、システムのテスト手法の一つで、個々のモジュールを対象としたテストの事を指します。対象のモジュールが要求や性能を満たしているか確認する為に実行します。

C#のDB接続を使用したユニットテストに関して

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 224

ysakusaku

score 1

 前提・実現したいこと

・DB接続を使用したユニットテストを行いたい

 発生している問題・エラーメッセージ

初めて質問いたします。
現在VisualStudioを使用しプログラミング研修を行っています。
DAOを作成し正常系のテストを実施したのですが、DB接続の部分で失敗してしまいます。
他クラスではDB接続はできていたため、文法の間違いはないかと思います。
ユニットテストではDB接続はできない仕様なのでしょうか。

 開発環境

OS:Windows10

ツール:
・ASP.NET
・Visual Studio 2017
・SQL Server 2014

 該当のソースコード

        /// <summary>
        /// ID重複確認用メソッド
        /// </summary>
        /// <pre>
        /// 引数としてint型IDを受け取り、SQLサーバーに検索をかける
        /// IDの重複がなければ、0を返し、重複があれば1を返す
        /// </pre>
        /// <param name="id"></param>
        /// <returns></returns>
        public int CountByPrimaryKey(int id)
        {
            int cnt = 0;

            try
            {
                using (SqlConnection conn = new SqlConnection(
                    ConfigurationManager.ConnectionStrings["DB"].ConnectionString))
                {
                    conn.Open();
                    //sql文
                    StringBuilder sb = new StringBuilder();
                    sb.Append("SELECT COUNT(*)AS CNT FROM dbo.USER_MASTER WHERE ID = @Id");
                    SqlCommand sql = null;
                    SqlDataReader reader = null;

                    try
                    {
                        if (Logger.IsDebugEnabled)
                        {
                            Logger.Debug(sb.ToString());
                        }
                        sql = new SqlCommand(sb.ToString(), conn);
                        sql.Parameters.AddWithValue("@Id", id);

                        if (Logger.IsDebugEnabled)
                        {
                            Logger.Debug(sb.ToString());
                        }

                        reader = sql.ExecuteReader();
                        reader.Read();
                        cnt = reader.FieldCount;

                    }
                    catch (Exception e)
                    {
                        Logger.Fatal(e);
                        throw new Exception();
                    }
                }
            }
            catch(Exception e)
            {
                Logger.Fatal(e);
                throw new Exception();
            }
            return cnt;
        }

 テストコード

    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestMethod1()
        {
            DataAccessObject test = new DataAccessObject();
            int id = 1;

            int i = test.CountByPrimaryKey(id);
            Assert.AreEqual(i, 0);
        }
    }

 エラーメッセージ

System.NullReferenceException: 'オブジェクト参照がオブジェクト インスタンスに設定されていません。'

System.Configuration.ConnectionStringSettingsCollection.this[string].get が null を返しました。

 システム構成

ソリューション'MyStudy.net'
|
|
|---Step2(プロジェクト)
|    ・DataAccessObject.cs
|    ・Web.config
|
|---Step2Test(テストプロジェクト)
|    ・UnitTest1.cs

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • alg

    2018/07/20 09:34

    SurferOnWwwさん DAO は、おそらくMSの提供するDAOではなく一般的な意味でのData Access Objectを指すのではないでしょうか。

    キャンセル

  • SurferOnWww

    2018/07/20 09:34

    もう一つ、コードは ``` と ``` で囲ってください。インデントされて見やすくなります。

    キャンセル

  • SurferOnWww

    2018/07/20 09:37

    alg さん> Microsoft の言う DAO は一般的な Data Access Object とは違うと理解していますが? 参考: https://ja.wikipedia.org/wiki/Data_Access_Objects

    キャンセル

回答 3

checkベストアンサー

+1

プロジェクトが異なれば別の設定ファイルが使われます。
テストプロジェクトで接続文字列を設定していないのではありませんか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/20 09:47

    回答ありがとうございます。
    おっしゃるとおり、テストプロジェクト側で接続文字列を設定しておりませんでした。
    テストプロジェクト側にweb.configを作成し、同じように接続文字列を設定する必要があるということでしょうか。

    キャンセル

  • 2018/07/20 10:02

    おそらくテストプロジェクトは ASP.NET ではないと思います。Properties.Settings.settings を編集してください。

    キャンセル

  • 2018/07/20 10:24

    Zuishin様のアドバイスどおりにProperties.SettingsでDB接続を設定したら接続ができました!
    テストも問題なく動きました!
    ありがとうございます!

    キャンセル

+1

System.NullReferenceException: 'オブジェクト参照がオブジェクト インスタンスに設定されていません。'

System.Configuration.ConnectionStringSettingsCollection.this[string].get が null を返しました。

たぶん、以下の行でエラーが出ているのだと思いますが、そうだとすると、それは SQL Server に接続して操作する以前の問題で、接続文字列が取得できてないのでしょう。

using (SqlConnection conn = new SqlConnection(
                    ConfigurationManager.ConnectionStrings["DB"].ConnectionString))

App.config に接続文字列の設定はありますか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/20 09:49

    回答ありがとうございます。
    DAOのプロジェクトのweb.configには接続文字列の設定はしております。

    キャンセル

  • 2018/07/20 09:54 編集

    web.config? ということは ASP.NET Web アプリですか? ソリューション/プロジェクトは全体的にどういう構成になっているのでしょう? 「テストコード」というのはどこに存在するのですか?

    あと、開発環境を書いていただくようお願いしたのですが、無視しないで書いていただければと思います。

    #Microsoft のアプリでは DAO と言うよりは、ADO.NET + SqlClient と言った方が良いかと思います。

    キャンセル

  • 2018/07/20 10:11

    構成と開発環境の追記をいたしました。
    ご確認いただければ幸いです。

    キャンセル

0

皆様にご指摘いただき無事にDB接続がテストプロジェクト側でできました。

テストプロジェクト側でProperties.Settings.settingsで接続文字列を指定することで接続ができました。

別のプロジェクトであったため、テストプロジェクト側でも指定が必要という初歩的なミスでした。

お付き合いいただいた皆様、お忙しい中ありがとうございました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.51%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C#

    7147questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • SQL Server

    591questions

    SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

  • ユニットテスト

    35questions

    ユニットテストは、システムのテスト手法の一つで、個々のモジュールを対象としたテストの事を指します。対象のモジュールが要求や性能を満たしているか確認する為に実行します。