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 应用程序项目有一个数据层,它在网页和提供者之间进行交互,如下所示:

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 中运行它时,这总是给我一个空指针执行。如何让我的提供商使用新的连接字符串来指向我的测试数据库?我尝试添加了一个 app.config 文件,但它不起作用。

4

1 回答 1

1

运行测试时,默认情况下,您的 app.config(它是 web.config 的副本)似乎没有作为配置文件加载。

我宁愿通过以下方式解决这个问题:

  1. 创建IConfiguration接口,封装获取connectionString的细节

        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存根,它返回您测试所需的任何连接字符串。(您可以使用 moq/rhino-mock 之类的模拟框架或IConfiguration不读取 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 回答