使用ADODB.Recordset作为输入参数的WCF方法的单元测试

时间:2013-11-20 09:40:15

标签: wcf unit-testing vb6 adodb

我有一个WCF服务,它是VB应用程序的外观。我的VB应用程序需要一个ADODB.Recordset作为我的输入参数。 我已经为这种方法编写了一个单元测试,但我不知道如何为测试目的手动创建一个记录集。

我想出了这个(在网上长时间搜索之后):

ADODB.Recordset tempRS = new ADODB.Recordset();
tempRS.Fields.Append("Field1", ADODB.DataTypeEnum.adChar);  
tempRS.Fields.Append("Field2", ADODB.DataTypeEnum.adInteger);

但是此记录集中没有数据。或者另一次尝试:

ADODB.Recordset temp = new ADODB.Recordset();
temp.Open();
temp.AddNew("Field1", "data for field 1");
temp.AddNew("Field2", "1");

但我在temp.Open()声明The connection cannot be used to perform this operation. It is either closed or invalid in this context.

时收到错误

有人能指出我正确的方向吗?我已阅读msdn但未找到符合我需求的示例。

提前致谢!

3 个答案:

答案 0 :(得分:2)

我亲自编写了C#单元测试,其中我已经成功实例化了一个真实的ADODB.Recordset并用数据填充了它,所以我可以向你保证它是可能的。

关键是在断开连接模式下打开记录集。这为您提供了等效于DataTable的ADO,并且不需要数据库连接。您可以通过将游标类型显式设置为静态来完成此操作,例如

temp.Open(CursorType: CursorTypeEnum.adOpenStatic);

注意:静态游标也可以在连接模式下使用。但是,它们是唯一在断开连接模式下有意义的游标类型,这就是您需要明确指定它的原因。

答案 1 :(得分:1)

当你做的时候,在我看来,

  

ADODB.Recordset temp = new ADODB.Recordset(); temp.Open();

它查找连接并因为连接已关闭/不存在而收到错误。 当然,对于单元测试,您希望避免与任何配置或外部系统通信。如果你想要,那就是集成测试。

你可以做的是一些模仿记录集行为的虚假实现。这仅在测试执行期间。在实际的应用程序执行期间,您将使用真实的记录集。

你把它连接起来的方式如下所示。您需要引入几个接口,如下所示。

在VB ADODB记录集对象周围创建一个包装器接口。它会有很多方法允许你操作真实的记录集。像下面的东西。

 public interface IRecordSet {
    void Open();
    void AddNew();
    void Add(string key, object value);
 }

创建一个允许您访问IRecordSet实现的因子。像下面的东西

  public interface IRecordSetFactory {
    IRecordSet Create();
  }

  public class RecordSetFactory : IRecordSetFactory {
    public IRecordSet Create()
    {
        return new ADODB.Recordset();
    }
 }

您的SUT(受测系统将使用RecordSetFactory并允许您创建新的ADODB.Recordset()

现在,在单元测试期间,您可以根据需要更改实际行为。

在你的测试区域中创建一个Stub / Fake Record Set而不是真实的(由于你没有声明你正在使用任何隔离/模拟对象框架,你可以简单地推出一个手写的存根,如下所示。)

public class StubRecordSetFactory : IRecordSetFactory
{
    public IRecordSet Create() {
        return new StubRecordSet();
    }
}

您的测试现在可以使用StubRecordSet

[TestMethod]
public void YourWhatEverTest()
{
    var factory = new StubRecordSetFactory ();
    var stubRecordSet = factory.Create();

    //call SUT
    //...

    //Any asserts/verifications
    //...
}

答案 2 :(得分:1)

如果其他人遇到此错误,我使用以下代码解决:

private ADODB.Recordset createRecordSet()
    {            
        ADODB.Recordset tempRS = new ADODB.Recordset();
        tempRS.Fields.Append("Field1", DataTypeEnum.adVarChar, 255);
        tempRS.Fields.Append("Field2", ADODB.DataTypeEnum.adInteger, 5);            
        tempRS.Open(CursorType: CursorTypeEnum.adOpenStatic);

        tempRS.AddNew();
        tempRS.Fields["Field1"].Value = "test from UnitTest";
        tempRS.Fields["Field2"].Value = 1;
        return tempRS;
    }