テスターですが何か?

ホビープログラマ略してHPです

Quill+NUnit+ADO.NET Entity Framerworkでデータベースアクセスのテスト

leave a comment »

NUnitを使ってデータベースアクセスを行なっているクラスのテストをしようとしたところ、ハマったので記録を残しておきます。QuillやEntity Framework固有なのか、そもそもデータベースアクセスをおこなっているクラスのテストのためには必要なのかはよくわかっていません。

アプリケーションの情報はこのようになっています。

【被テストクラス】

  • Webアプリケーションプロジェクト(WebForm+C#)
  • ADO.NET Entity Framework + Linq To Entities
  • DB接続文字列はWeb.configに記載
  • Seasar.NET(Quill)でDI

【テストクラス】

  • クラスライブラリ(Nunit)

 

被テストクラスのソースです。EntityFramework + Linq To Entitesです。

public class PowerSavingModel : IPowerSavingModel
{
    private LightElectricityEntities DB = new LightElectricityEntities();

    public IEnumerable<PowerSaving> GetDailyData(string targetData)
    {
        var Query = from t in DB.PowerSaving
                    where t.Date == targetData &&
                    t.TodayUsage != 0
                    orderby t.Hour ascending
                    select t;
        return Query;
    }

}

で、テストクラス。NUnit+Quillです。

[TestFixture()]
public class PowerSavingModelTest
{
    protected IPowerSavingModel Target;

    [SetUp()]
    public void SetUp()
    {
        QuillInjector.GetInstance().Inject(this);
    }

    [Test()]
    public void GetDailyDataTest()
    {
        var Result = Target.GetDailyData("20110401");

        var Assertee = Result.First();
        Assert.AreEqual("20110401", Assertee.Date);
        Assert.AreEqual("0", Assertee.Hour.ToString());
        Assert.AreEqual("2772", Assertee.TodayUsage.ToString());
        Assert.AreEqual("2680", Assertee.PreviousDayUsage.ToString());
        Assert.AreEqual("-3.43", Assertee.PreviousDaySaving.ToString());
        Assert.AreEqual("3061", Assertee.PreviousYearUsage.ToString());
        Assert.AreEqual("9.44", Assertee.PreviousYearSaving.ToString());

    }
}

これを実行すると、動きそうなんですがエラーになります。

image

LightElectricity.Test.Controller.DailySummaryControllerTest.IndexTest1:
SetUp : Seasar.Quill.Exception.QuillApplicationException : [EQLL0036]コンポーネント[PowerSavingModel]のインスタンス生成中に失敗しました。コンストラクタ内の処理、アクセス修飾子などをご確認下さい。
  —-> System.Reflection.TargetInvocationException : 呼び出しのターゲットが例外をスローしました。
  —-> System.ArgumentException : 指定された名前付き接続は、構成内に見つからないか、EntityClient プロバイダーと併用することを意図していないか、または無効です。

 

場所 Seasar.Quill.QuillComponent.CreateObject(Type componentType, Type receiptType)
場所 Seasar.Quill.QuillContainer.GetComponent(Type type, Type implType)
場所 Seasar.Quill.QuillInjector.InjectField(Object target, FieldInfo field, Type implType)
場所 Seasar.Quill.QuillInjector.Inject(Object target)
場所 LightElectricity.Test.Model.PowerSavingModelTest.SetUp() 場所 D:\Develop\LightElectricity\LightElectricity.Test\Model\PowerSavingModelTest.cs:行 20
–TargetInvocationException
場所 System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck)
場所 System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache)
場所 System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean skipCheckThis, Boolean fillCache)
場所 System.Activator.CreateInstance(Type type, Boolean nonPublic)
場所 Seasar.Quill.QuillComponent.CreateObject(Type componentType, Type receiptType)
–ArgumentException
場所 System.Data.EntityClient.EntityConnection.ChangeConnectionString(String newConnectionString)
場所 System.Data.Objects.ObjectContext..ctor(String connectionString, String defaultContainerName)
場所 LightElectricity.Model.LightElectricityEntities..ctor() 場所 D:\Develop\LightElectricity\LightElectricity\Model\LightElectricityEntity.Designer.cs:行 34
場所 LightElectricity.Model.PowerSavingModel..ctor() 場所 D:\Develop\LightElectricity\LightElectricity\Model\PowerSavingModelModel.cs:行 40

 

原因としてはテストプロジェクトにデータベース接続文字列を定義した設定ファイルがないためです、なのでテストプロジェクトにApp.configを追加してデータベース接続文字列を追加します。(被テストプロジェクトのWeb.confiをリンクとして追加すれば動くのかと思いましたが、動きませんでした。被テストがWebアプリプロジェクトで、テストプロジェクトがクラスライブラリだからかもしれません)

App.configの内容です。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <connectionStrings>
    <add name="ApplicationServices" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnetdb.mdf;User Instance=true" providerName="System.Data.SqlClient" />
    <add name="LightElectricityEntities" connectionString="metadata=res://*/Model.LightElectricityEntity.csdl|res://*/Model.LightElectricityEntity.ssdl|res://*/Model.LightElectricityEntity.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=ORE1\SQLEXPRESS;Initial Catalog=LightElectricity;Integrated Security=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>
</configuration>

これで、単体テストが通るようになりました。

image

Written by david9142

2011年4月16日 @ 4:25 PM

カテゴリー: LightElectricity

Tagged with , , ,

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。