我有一个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
但未找到符合我需求的示例。
提前致谢!
答案 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;
}