1

私はDALを使用したasp.netプロジェクトを持っています(ほとんどのコードは他の人からのものですが、メンテナンスとクリーンアップを行っています)。

私の Web アプリケーション プロジェクトには、次のような dataprovider クラスがあります。

public class DataProvider : IDataProvider
{
     private string DefaultConnectionString
    {
        get
        {
            return ConfigurationManager.ConnectionStrings[ConfigurationManager.AppSettings["myConnection"]].ConnectionString;
        }
    }

    public T ExecuteMyQuery<T>(parameters)
    {
          //executes query on db
    }

この Web アプリケーション プロジェクトには、Web ページとプロバイダーの間で次のようにやり取りするデータ レイヤーがあります。

public class MyData : IMyData
{
    private readonly IDataProvider dataProvider;

    public MyData(IDataProvider dataProvider)
    {
        this.dataProvider = dataProvider;
    }

    public string GetTitle(string myVar)
    {
        //builds up stuff to send

         return this.dataProvider.ExecuteMyQuery(...);
     }
 }

このプロジェクトの接続文字列は web.config にあります。

今、私は私のテストを持っています。単純化と時間の制約のために、私はテスト データベースのみを使用しており、実際のオブジェクトを作成し、テスト データベースに対してテストします (理論的には、より多くのモック、スタブ、およびあらゆる種類のものを使用しますが、時間はありません)。

したがって、上記の Web アプリケーション プロジェクトを参照するテスト プロジェクトがあります。

public class MyTests
{
    private MyData myData;
    private DataProvider dataProvider;

    [SetUp]
    protected void SetUp()
    {
        dataProvider = new DataProvider();
        mysData = new MyData(dataProvider);   
    }

    [Test]
    public void CheckTitles()
    {
        string title = myData.GetTitle("AVariable");

        Assert.AreEqual(title, "A typical title");
    }

しかし、これを NUnit で実行すると、null ポインターの実行が引き続き発生します。プロバイダーが新しい接続文字列を使用してテスト データベースを指すようにするにはどうすればよいですか? app.config ファイルを追加しようとしましたが、機能しません。

4

1 に答える 1

1

テストの実行中、デフォルトではapp.config(web.configのコピー)が構成ファイルとしてロードされていないようです。

私はそれを次のように解決したいと思います:

  1. IConfigurationconnectionStringの取得の詳細をカプセル化するインターフェースを作成します

        public interface IConfiguration {
            string MyConnectionString { get; }
        }
    
  2. 実際のコードで使用するためのIConfiguration読み取りの実装を作成します)web.config

    public class Configuration : IConfiguration
    {
        public string MyConnectionString
        {
            get { return ConfigurationManager.ConnectionStrings[ConfigurationManager.AppSettings["myConnection"]].ConnectionString; }
        }
    }
    
  3. クラスIConfigurationに依存関係を導入するDataProvider

    public class DataProvider : IDataProvider
    {
        private IConfiguration configuration;
    
        public DataProvider(IConfiguration configuration)
        {
            this.configuration = configuration;
        }
    
        private string DefaultConnectionString
        {
            get
            {
                return configuration.MyConnectionString;
            }
        }
    
        ...
    }
    

    単純なリファクタリングweb.configは、あなたからの読書に関する知識を抽出しますDataProvider:)

  4. IConfigurationテストでは、テストに必要な接続文字列を返すスタブを使用します。IConfiguration(moq / rhino-mockのようなモックフレームワークを使用するか、app.configを読み取らない実装によってスタブを作成できます)

    public class MyTests
    {
        private MyData myData;
        private DataProvider dataProvider;
        private IConfiguration configuration;
    
        [SetUp]
        protected void SetUp()
        {
            // e.g. here stub is created via Moq
            var configurationMock = new Mock<IConfiguration>();
            configurationMock.SetupGet(x => x.MyConnectionString).Returns("test connection string");
            configuration = configurationMock.Object;
    
            dataProvider = new DataProvider(configuration);
            mysData = new MyData(dataProvider);   
        }
    
        ...
    }
    

読書web.configがあなたのテストの目標でないなら、そのアプローチはあなたが必要とするものです。
構成の読み取りに関するボーナス知識として、分離されたクラスに行きます:)

于 2012-12-11T21:34:39.587 に答える