2017-02-07 2 views
1

Некоторые предпосылки, прежде чем я займусь вопросом. В настоящее время я работаю над проектом, который переносится с IBM DB2 на SQL Server. Не вдаваться в подробности, но этот связанный с DB2 сервер иногда отключается от SQL-сервера, что нормально для связанных серверов. У меня это работает в коде и у меня есть настройка процесса, чтобы позаботиться об этом.Единичный тест для определенных типов исключений

В любом случае, я пытаюсь написать метод тестирования, который генерирует исключение DbException (которое является исключением, которое возникает при подключенном сервере не подключено) для проверки процесса, который я написал, когда связанный сервер отключен. Есть ли способ заставить бросить определенный тип исключения, чтобы я мог проверить свой код?

Пытаться поймать блок выглядит примерно так:

try 
{ 
    //Regular Processing and attempt to update to DB2 
} 
catch (DbException ex) 
{ 
    //Other processing to catch a linked server issue 
} 
catch (Exception ex) 
{ 
    //Even more processing for other exceptions 
} 

ответ

2

Это тот же метод, как и большинство модульного тестирования, Inject вашу зависимость с помощью интерфейс, поместите свою реальную логику db в один класс на основе этого интерфейса и ваш тестовый материал в другом, основанный на этом интерфейсе.

interface IDBProcessor 
{ 
    void Process() 
} 

class ThrowyClass : IDBProcessor 
{ 
    public Exception ThrowThis {get; set;} 
    public void Process() 
    { 
     throw ThrowThis; 
    } 
} 


void MyMethod(IDBProcessor processor) 
{ 
    try 
    { 
    processor.Process() 
    } 
    catch (DbException ex) 
    { 
    //Other processing to catch a linked server issue 
    } 
    catch (Exception ex) 
    { 
    //Even more processing for other exceptions 
    } 
} 

Затем в тестовом модуле, Сделайте ThrowyClass за исключением вы хотите, и передать его в. (Есть насмешливые рамки, которые спасут вас от класса Test, если вам нравится).

[Test] 
void MyThrowTest() 
{ 
    var throwy = new ThrowyClass() { ThrowThis = new SomeSpecificException() }; 
    var myClass = new MyClass() 
    myClass.MyMethod(throwy); 
    // Assert what you expect 
} 

Вам нужно будет настроить все в своем конкретном приложении. Вы можете вводить IProcessor в конструкторе «MyClass»

0

Вы можете просто бросить его, как таким образом:

throw new DbException(); 
+1

' DbException' - абстрактный класс. Вы должны либо создать собственный класс исключений, который может быть получен из него, а затем выбросить свой собственный класс или выбросить любой существующий тип, который происходит из 'DbException', например' SqlException'. –

+0

Вы правы, я был жестким, это был обычный класс, который наследуется от класса Exception –

0

Вы должны смотреть на IDbConnection и попробовать Moq рамки
код хотел следующее

var dbConnectionMock = new Mock<IDbConnection>(); 
dbConnectionMock.Setup(x => x.Open()) 
        .Callback(() => { 
          throw new SqlException(); 
         }).Verifiable(); 

https://github.com/Moq/moq4/wiki/Quickstart