2015-11-20 8 views
1

У меня есть следующий метод, называемый Execute() из класса Abstract, называемого AutoLetterGenBatch, в моем ConsoleApp. Я пытаюсь это проверить.Тестирование модуля с носовыми носками

public void Execute() 
{ 
    BatchJobSecurity.Instance.CreatePrincipal(); 
    DoExecute(); 
} 

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

[TestMethod] 
public void TestMethod1() 
{ 
    AutoLetterGenBatchJob ALGBJ = new AutoLetterGenBatchJob(); 
    ALGBJ.Execute(); 
} 

Однако, когда я иду, чтобы сделать билд это дает мне эту ошибку компиляции Ошибка 34 Не удается создать экземпляр абстрактного класса или интерфейса «AutoLetterGenBatch.AutoLetterGenBatchJob».

Я немного новичок в модульном тестировании. Я понимаю, что это, вероятно, не большая часть теста, но я просто хочу, чтобы мой метод Execute() попал в настоящее время. Я прочитал, что хороший способ обойти эту проблему с абстрактными классами - создать макет объекта для абстрактного класса. Поэтому я стараюсь делать это с RhinoMocks.

[TestMethod] 
public void TestMethod1() 
{   
    AutoLetterGenBatchJob ALGBJ = MockRepository.GenerateStub<AutoLetterGenBatchJob>(); 
    ALGBJ.Execute(); 
} 

В настоящее время он строит все правильное использование утверждений на месте. Однако, когда тест проходит, я получаю эту ошибку. Невозможно найти конструктор с соответствующими аргументами. Снова я довольно новичок в этом. Если кто-то может помочь мне понять, что мне нужно сделать, это будет оценено по достоинству.

ответ

0

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

Использование mocking framework будет одним из способов, так же как и создание собственного тестового класса. Лично я сначала пошёл бы с 'roll your own', так как это будет легче отлаживать.

public class TestAutoLetterGenBatch : AutoLetterGenBatch 
{ 

} 

когда у вас есть этот класс, вы увидите, что вам нужно вызвать конструктор, который AutoLetterGenBatch декларирует. Это та же проблема, что и ринон издевается над ним. Не видя класс AutoLetterGenBatch, мы не можем советовать дальше.

Для чего это стоит, новички Rhino недавно видели небольшую работу, и вам, вероятно, будет лучше использовать Moq или другую более активную структуру.

Также вам необходимо выполнить generate a partial mock, чтобы сделать тестирование, которое вы хотите сделать, без заглушки.