Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
以ADODB.Recordset作为输入参数的WCF方法的单元测试_Wcf_Unit Testing_Vb6_Adodb - Fatal编程技术网

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

以ADODB.Recordset作为输入参数的WCF方法的单元测试,wcf,unit-testing,vb6,adodb,Wcf,Unit Testing,Vb6,Adodb,我有一个WCF服务,它是VB应用程序的门面。我的VB应用程序需要ADODB.Recordset作为我的输入参数。 我已经为此方法编写了一个单元测试,但是我不知道如何手动创建一个记录集来进行测试 我(在网上搜索了很长时间后)想到了这个: 但此记录集中没有数据。或者再试试: ADODB.Recordset temp = new ADODB.Recordset(); temp.Open(); temp.AddNew("Field1", "data for field 1"); temp.AddNew(

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

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

但此记录集中没有数据。或者再试试:

ADODB.Recordset temp = new ADODB.Recordset();
temp.Open();
temp.AddNew("Field1", "data for field 1");
temp.AddNew("Field2", "1");
但是我在
temp.Open()
语句中得到一个错误,它说
连接不能用于执行此操作。在此上下文中,它已关闭或无效。

有人能给我指出正确的方向吗?我已经阅读了
msdn
,但没有找到适合我需要的示例


提前谢谢

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

ADODB.Recordset temp=new ADODB.Recordset();打开温度()

它查找一个连接,您会收到一个错误,因为该连接已关闭/不存在。 当然,对于单元测试,您希望避免与任何配置或外部系统交谈。如果您愿意,那么这将是一个集成测试

您可以做的是模拟记录集行为的两个伪实现。这仅在测试执行期间进行。在实际应用程序执行期间,您将使用真实的记录集

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

public class StubRecordSetFactory : IRecordSetFactory
{
    public IRecordSet Create() {
        return new StubRecordSet();
    }
}
围绕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()

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

在您的测试区域中,创建一个存根/伪记录集,而不是真实的记录集(因为您没有声明您正在使用任何隔离/模拟对象框架,所以您只需按如下所示推出一个手写存根。)

您的测试现在可以使用StubRecordSet

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

    //call SUT
    //...

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

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

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

它查找一个连接,您会收到一个错误,因为该连接已关闭/不存在。 当然,对于单元测试,您希望避免与任何配置或外部系统对话。如果您确实希望,那么它将是一个集成测试

你可以做的是模拟记录集行为的两个假实现。这只是在测试执行期间。在实际应用程序执行期间,你将使用真实的记录集

连接的方式如下所示。您需要引入两个接口,如下所示

public class StubRecordSetFactory : IRecordSetFactory
{
    public IRecordSet Create() {
        return new StubRecordSet();
    }
}
围绕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()

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

在您的测试区域中,创建一个存根/伪记录集,而不是真实的记录集(因为您没有声明您正在使用任何隔离/模拟对象框架,所以您只需按如下所示推出一个手写存根。)

您的测试现在可以使用StubRecordSet

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

    //call SUT
    //...

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

我个人编写了C#单元测试,在其中我成功地实例化了一个真实的
ADODB.Recordset
,并用数据填充它,因此我可以向您保证这是可能的

关键是在断开连接模式下打开记录集。这将为您提供与
数据表
相当的ADO,并且不需要db连接。您可以通过将游标类型显式设置为static来实现这一点,例如

temp.Open(CursorType: CursorTypeEnum.adOpenStatic);

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

我个人编写了C#单元测试,在其中我成功地实例化了一个真实的
ADODB.Recordset
并用数据填充它,因此我可以向你保证这是可能的

关键是在断开连接模式下打开记录集。这将为您提供与
数据表
相当的ADO,并且不需要db连接。您可以通过将游标类型显式设置为static来实现这一点,例如

temp.Open(CursorType: CursorTypeEnum.adOpenStatic);

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

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

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;
    }

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

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;
    }

您是否正在测试真正的ADODB连接?即连接到外部系统,如db?否。我只想测试我编写测试的方法,并且需要手动创建ADODB记录集。您是否正在测试真正的ADODB连接?即连接到外部系统,如db?否。我只想测试我编写测试的方法和i ne我创建了一个手动创建的adodb记录集。我将尝试这种方法。我必须创建记录集并用字段填充它,还是我可以只
addnew
到一个空记录集?你必须先填充
字段
集合,然后
打开
它,然后开始添加行。我将尝试这种方法。我必须创建记录集吗然后用字段填充它,或者我可以将新的
添加到空记录集中?您必须先填充
字段
集合,然后
打开它,然后才能开始添加行。