2016-02-29 6 views
0

У меня есть класс, который отвечает за создание слайдов PPT для экспорта. Чтобы проверить это, я создал интерфейс, чтобы он мог насмехаться с помощью Moq; все до сих пор. Однако я сталкиваюсь с трудностями при попытке проверить, что мой метод был вызван. Это метод void, поэтому на данный момент я хочу знать только, что метод был удален.Проверка, вызван ли метод void с использованием Moq

Вот мой интерфейс:

interface IPowerpointExporter 
{ 
    void AddSlides(int amount); 

    void setTitle(string title); 
} 

А вот мой блок тест:

[TestMethod] 
public void testPPTObject() 
{ 
    var mockPPT = new Mock<IPowerpointExporter>(); 
    mockPPT.Setup(m => m.AddSlides(1)).Verifiable(); 
    mockPPT.Object.AddSlides(1); 
    mockPPT.VerifyAll(); 
} 

Однако, когда я пришел, чтобы позвонить AddSlides() я получаю GeneratorException. Объяснение этого в том, что мой IPowerpointExporter не был доступен. У меня такое чувство, потому что я пытаюсь вызвать метод на интерфейсе, хотя я не уверен, так как на данный момент у меня есть объект на mockPPT.Object.AddSlides();.

Обратите внимание, что я также попытался выполнить попытку использовать фактический объект, а не Interface.Object. Это также дает то же исключение:

[TestMethod] 
public void testPPTObject() 
{ 
    var mockPPT = new Mock<IPowerpointExporter>(); 
    mockPPT.Setup(m => m.AddSlides(1)).Verifiable(); 

    ExportPowerPoint temp = (ExportPowerPoint)mockPPT.Object; 
    temp.AddSlides(1); 
    mockPPT.VerifyAll(); 
} 

Использование Moq Как я могу проверить, что мой метод был вызван? Что я делаю выше по правильной линии?

+1

Кажется, что вы проверяете свой макет. Вы должны протестировать код с помощью IPowerpointExporter, и убедитесь, что метод на (издеваемом) интерфейсе называется – andreasnico

ответ

3

Вероятно, вы получаете это исключение, потому что ваш интерфейс не public, или иначе видимый для сборки Moq. См. this question, чтобы решить эту проблему.

Если это всего лишь фиктивный код, который поможет вам изучить Moq, тогда не читайте дальше.


Однако, если это фактическое испытание, которое, по вашему мнению, имеет ценность, тогда у вас есть другие более фундаментальные проблемы. В вашем первом примере, , вы ничего не делаете, чтобы протестировать свой код! Давайте пройти через это, построчно:

var mockPPT = new Mock<IPowerpointExporter>(); 

Вы создали макет своего интерфейса IPowerpointExporter, до сих пор так хорошо.

mockPPT.Setup(m => m.AddSlides(1)).Verifiable(); 

Вы сказали издеваться ожидать вызова это AddSlide метод, с аргументом 1, и что этот метод может быть проверен. Пока нет проблем.

Но вот где он идет с рельсов. Вы просто вызываете метод на ваш макет, тот, который вы только что установили выше. Объект Object является фиктивным объектом, он может делать только то, что он был настроен, и не имеет связей с вашей реальной реализацией!

mockPPT.VerifyAll(); 

Теперь вы подтвердили, что вызвали все свои поддающиеся проверке методы. Все, что вы сделали в этом тесте, это проверка того, что Moq работает; ваш код никогда не касался.

Давайте посмотрим на измененный код в вашем втором примере в настоящее время:

ExportPowerPoint temp = (ExportPowerPoint)mockPPT.Object; 
temp.AddSlides(1); 

Это отбрасывать никогда не будет работать. Свойство Object - это просто прокси (фактически динамический тип), созданный Moq, который ничего не знает о какой-либо конкретной реализации интерфейса, которую он издевается.

+0

. Чтобы вернуться на правильный путь, как я могу проверить, что вызов метода был удален? Просто ли создать объект ExportPowerPoint и вызвать метод AddSlides() на нем достаточно, чтобы вызвать VerifyAll()? – Novastorm

+0

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

0

Это исключение возникает из-за того, что интерфейс IPowerpointExporter недоступен для Moq.

Вы можете сделать свой интерфейс IPowerpointExporterpublic и тест работает отлично:

public interface IPowerpointExporter 
{ 
    void AddSlides(int amount); 

    void setTitle(string title); 
} 

.... 

[TestMethod] 
public void testPPTObject() 
{ 
    var mockPPT = new Mock<IPowerpointExporter>(); 
    mockPPT.Setup(m => m.AddSlides(1)).Verifiable(); 

    ExportPowerPoint temp = (ExportPowerPoint)mockPPT.Object; 
    temp.AddSlides(1); 
    mockPPT.VerifyAll(); 
} 

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

[assembly:InternalsVisibleTo("DynamicProxyGenAssembly2")] 
+0

Просто избили ответ Патрика, изменение интерфейса для публики стало способом – Novastorm

Смежные вопросы