2013-11-20 2 views
1

У меня есть служба WCF, которая является фасадом для приложения VB. Мое приложение VB ожидает, что ADODB.Recordset будет моим входным параметром. Я написал единичный тест для этого метода, но я не знаю, как вручную создать набор записей для целей тестирования.Единичное тестирование метода WCF с 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

Вы тестируете реальное соединение ADODB? подключаясь к внешней системе, такой как db? – Spock

+0

№. Я просто хочу проверить метод, на который я написал тест, и мне нужен набор записей adodb, созданный вручную. –

ответ

1

Я лично написал C# юнит-тестов, в которых я успешно инстанцированы реальный ADODB.Recordset и заселили ее с данными, так что я могу заверить вас, что возможно.

Ключом является открытие набора записей в отключенном режиме. Это дает эквивалент ADO для DataTable и не требует соединения db. Вы можете сделать это, явно указав тип курсора на статический, например.

temp.Open(CursorType: CursorTypeEnum.adOpenStatic); 

ПРИМЕЧАНИЕ: Статические курсоры также могут использоваться в подключенном режиме. Тем не менее, они являются единственным типом курсора, который имеет смысл в отключенном режиме, поэтому вам нужно указать его явно.

+0

Я попробую этот путь. мне нужно создать recodset и заполнить его полями, или я могу просто «добавить новый» в нулевой набор записей? –

+1

Сначала вы должны заполнить коллекцию «Поля», затем «Открыть», затем вы можете начать добавлять строки. –

1

Мне кажется, когда вы делаете ,,,,

ADODB.Recordset температура = новый ADODB.Recordset(); temp.Open();

ищет связь, и вы получите сообщение об ошибке, потому что соединение закрыто/не существует. Конечно, с помощью модульных тестов вы хотите избежать разговора с любой конфигурацией или внешними системами. Если вы этого захотите, то это будет интеграционный тест.

Что вы можете сделать, это пара поддельных реализаций, которые имитируют поведение набора записей. Это происходит только во время выполнения теста. Во время фактического выполнения приложения вы должны использовать реальный набор записей.

То, как вы подключаете это, было бы чем-то вроде ниже. Вам нужно ввести пару интерфейсов, как показано ниже.

Создайте интерфейс Wrapper вокруг объекта VB ADODB Record Set. Он будет иметь множество методов, которые позволят вам манипулировать реальным набором записей. Что-то вроде ниже.

Создать фактор, позволяющий получить доступ к реализации IRecordSet. Что-то, как показано ниже

public interface IRecordSetFactory { 
    IRecordSet Create(); 
    } 

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

Ваш SUT (тестируемой системы будет использовать RecordSetFactory и позволяет создать новый ADODB.Recordset()

Теперь во время модульного тестирования вы можете изменить реальное поведение, как хотелось бы.

В тестовой области создайте набор заглушек/поддельных записей вместо реального (так как вы не указали, что используете какой-либо изоляционный/макетный объект, вы можете просто развернуть ручную запись, как показано ниже.)

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 
    //... 
} 
0

Если кто-то попадет в эту ошибку, я решить ее, используя следующий код:

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; 
    } 
Смежные вопросы