C# 尝试为实现IDB命令的单元测试创建接口

C# 尝试为实现IDB命令的单元测试创建接口,c#,unit-testing,microsoft-fakes,C#,Unit Testing,Microsoft Fakes,我使用的是VS2012内置的Fakes框架 此设计问题与以下职位相关: 我不确定如何为“IDbAccess”设计类来成功地“伪造”命中数据库 Ex代码(摘自上一篇文章): 我还应该提到,我需要使用“OracleCommand”对象而不是IDbCommand,这会使事情更加复杂。OracleCommand对象没有接口。找到相关文章。也许用Fakes框架测试这种方法是不可行的。。。或者至少删除数据库依赖项。隐藏OracleDataAccess对象可能不值得,尽管它会带来很多麻烦。你不太可能需要伪造所

我使用的是VS2012内置的Fakes框架

此设计问题与以下职位相关:

我不确定如何为“IDbAccess”设计类来成功地“伪造”命中数据库

Ex代码(摘自上一篇文章):


我还应该提到,我需要使用“OracleCommand”对象而不是IDbCommand,这会使事情更加复杂。OracleCommand对象没有接口。找到相关文章。也许用Fakes框架测试这种方法是不可行的。。。或者至少删除数据库依赖项。隐藏OracleDataAccess对象可能不值得,尽管它会带来很多麻烦。你不太可能需要伪造所有涉及的东西。如果您有一个处理db访问的接口(最好是一个自定义包装器),那么您可以创建一个单独的实现,只返回传入的一些值。这就是假货的用途。db的工作方式与方法无关,只与特定调用的返回有关。
public class Foo : IFoo
{
    IDbAccess db;

    public Foo(IDbAccess db)
    {
        this.db = db; 
    }

    public Dictionary<string,string> GetSomething(string xyz)
    {
        var result = new Dictionary<string,string>
        db.commandText = "text..."
        db.connection = conn;
        result.Add(db.MethodWhatever(xyz));
        return result;
    }
}
[TestMethod()]
public void GetSomething()
{
    var dba = new StubIDbAccess();
    var target = new Foo(dba);

    var expected = new Dictionary<string, string> 
    {
        {"blahKey","blahValue"}
    };

    // get something
    var results = target.GetSomething("xyzstring");

    // verify results
    var actual = results.whatever;

    CollectionAssert.AreEqual(expected,actual);
}
public interface IDbAccess : IDbCommand
{
    ...?
}