Закрытый метод Moq c # для исключения - PullRequest
0 голосов
/ 13 января 2012

Учитывая этот класс:

public class MyClass 
{  
     private void MyMethod()  
     {  
         //...
     }  

     public void Execute()
     {  
        try
        {
             //...  
             MyMethod();  
             //... 
        }  
        catch(Exception e)  
        {  
            ...  
        }   
     }  
}

Как я могу издеваться над MyMethod, чтобы бросить OutOfmemoryException?

РЕДАКТИРОВАТЬ 1:

УчитываяВ следующей ситуации, когда MyMethod загружает некоторые данные из базы данных и возникает непредвиденная ошибка, MyMethod вызывает исключение.Я хочу быть в состоянии провести модульное тестирование этой ситуации.В моем случае предложение catch из метода execute.

Ответы [ 4 ]

6 голосов
/ 13 января 2012

Я не использую Moq, поэтому возможно , что есть какой-то способ сделать это - но я бы сказал, что если вам нужно, вы делаете насмешкунеправильно.

Обычно вы должны насмехаться над зависимостями - и вы не можете зависеть от их личных членов из класса, который вы пытаетесь протестировать, не так ли??Обычно я высмеиваю интерфейс - иногда может быть полезно высмеивать класс, но обычно я этого не делаю.Если вы вызываете какую-то зависимость и хотите, чтобы результатом этого вызова был OutOfMemoryException, просто сделайте этот публичный вызов сгенерировать исключение.

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

3 голосов
/ 13 января 2012

Можно использовать только публичные свойства и публичные методы (независимо от того, определены ли они в интерфейсе или непосредственно в классе).

0 голосов
/ 13 января 2012

У меня не было возможности попробовать это, но мы используем Moq там, где я работаю, и я тоже боролся с такими вещами.Во-первых, Moq не основан на публичном, частном и т. Д. Как таковом.Это основано на том, что ваш тестовый класс имеет видимость в.Мы много работаем с VB.net, так что моя недавняя память окрашена этим (то есть, бери с солью).1) Чтобы протестировать «приватные» методы - попробуйте сделать так, чтобы ваша тестовая сборка имела видимость в сборке, содержащей ваши тестируемые классы. Смотрите здесь для получения информации о том, как это сделать.Вам нужно будет изменить их на «внутренние» (так же, как друг в vb.net).В классическом TDD вы (как правило) стараетесь, чтобы все в вашем классе тестировалось и было доступно для самого теста.2) Как только у вас появится видение MyMethod, вы сможете смоделировать ответ любого типа исключения, которое вам нужно (при условии, что вы можете создать его экземпляр и выбросить его).3) Другие идеи заключаются в создании внутреннего класса в тестовом коде, который расширяет тестируемый класс и переопределяет метод, которым вы хотите управлять изнутри вашего тестового класса.

Иногда, особенно с устаревшим кодом, у вас естьделать некрасивые вещи, чтобы сделать код тестируемым.

0 голосов
/ 13 января 2012

То, с чем вы сталкиваетесь, в основном является ограничением примитивного waqy, который Mock работает для насмешек.

Существуют некоторые коммерческие структуры, которые работают вокруг этого - JustMock от Telerik является наиболее разумной ценой.Они работают, присоединяя себя в качестве профилировщиков и заменяя исполняемый байт-код - таким образом, они действительно СМЕЩАЮТ методы.

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

Они также не могут высмеивать статические методы, которые немногиеодни могут.Это очень полезно, потому что это позволяет вам, например, смоделировать вызов DateTime.UtcNow, чтобы он всегда возвращал СПЕЦИАЛЬНОЕ время, которое может потребоваться в модульном тесте.

Так что, извините, нет способасделай это с Мок.

...