Модульное тестирование с помощью Rhino Mocks

У меня есть следующий метод с именем 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();
}

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

1 ответ

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

Использование фальшивых фреймворков было бы одним из способов, как и создание собственного тестового класса. Лично я поначалу выбрал бы "катайся сам", так как это будет легче отлаживать.

public class TestAutoLetterGenBatch : AutoLetterGenBatch
{

}

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

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

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

Другие вопросы по тегам