代码之家  ›  专栏  ›  技术社区  ›  astef

如何模拟dbconnectionstringbuilder?

  •  1
  • astef  · 技术社区  · 7 年前

    下面是一个简单的代码,它再现了一个异常:

    var csbMock = new Mock<DbConnectionStringBuilder>();
    var csb = csbMock.Object;
    csb.ConnectionString = "data source=.;integrated security=true";
    Debug.WriteLine(csb.ConnectionString); // System.NullReferenceException in System.Data.dll
    

    堆栈帧仅由一行组成: at System.Data.Common.DbConnectionStringBuilder.get_ConnectionString()

    我的目标是简单地 DbConnectionStringBuilder.ConnectionString 模拟的属性。这里有什么问题?

    2 回复  |  直到 7 年前
        1
  •  2
  •   Nkosi    7 年前

    实际上没有必要嘲笑 DbConnectionStringBuilder Class 是的。

    使用该类不会产生连锁反应,因此您可以创建该类的实例并按原样使用它

    var builder = new DbConnectionStringBuilder();
    //Set the connection string directly
    builder.ConnectionString = "data source=.;integrated security=true";
    //or add the parts needed to create a connection string
    builder.Clear();
    builder.Add("integrated security", true);
    builder.Add("Data Source", ".");
    
        2
  •  0
  •   astef    7 年前

    这条线解决了这个问题:

    csbMock.CallBase = true;
    

    里面有魔法 DbConnectionStringBuilder.ConnectionString 二传手。它调用被代理重写的虚拟成员,然后在getter中调用这个nre hapens。