以ADODB.Recordset作为输入参数的WCF方法的单元测试
我有一个WCF服务,它是VB应用程序的门面。我的VB应用程序需要ADODB.Recordset作为我的输入参数。 我已经为此方法编写了一个单元测试,但是我不知道如何手动创建一个记录集来进行测试 我(在网上搜索了很长时间后)想到了这个: 但此记录集中没有数据。或者再试试:以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(
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
到一个空记录集?你必须先填充字段
集合,然后打开
它,然后开始添加行。我将尝试这种方法。我必须创建记录集吗然后用字段填充它,或者我可以将新的添加到空记录集中?您必须先填充字段集合,然后打开它,然后才能开始添加行。