2017-01-18 13 views
-1

Я тестирование публичный API, однако, внутренне мой API вызывает функцию с подписью какC# Mock защищен внутренней виртуальной функции с входом как объект

protected internal virtual void AddBook(Book book) 
{ 
    if (null !=book) 
     bookList= book; 
} 

И Booklist также определяется как

public virtual BookInformation bookList{ get; protected internal set; } 

Мне нужно установить этот список книг. Я могу сделать это либо с помощью функции AddBook, либо напрямую с помощью bookList. bookList также определяется как «protected internal set».

Я попытался

var mockModule = new Mock<myModule> { CallBase = true }; 
mockModule.Protected() 
    .Setup<Book>("AddBook", book); 

Но я получаю сообщение об ошибке, что "AddBook" не существует.

Любые идеи, что мне не хватает?

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

+0

не связан с вопросом, но тот факт, что отдельная 'book' может быть назначена' bookList' (которая будет считаться * списком книг) немного запутанна. Он также игнорирует имя метода - это не * добавление * книги, а * установка * списка книг. – Rob

+0

Рассмотрите, пожалуйста, здесь http://stackoverflow.com/questions/17569746/mocking-internal-classes-with-moq-for-unit-testing – Artem

ответ

0

Когда вы пишете .Setup<Book>("AddBook", book);, это издевается над методом с возвращаемым типом Book, но ваш тип возврата недействителен. Вот почему вы получаете сообщение об ошибке, что AddBook не существует. Вместо этого вам нужно позвонить .Setup("AddBook", book).

издеваться защищенного элемента необходимо сначала включить следующую строку в верхней части испытательного стенда:

using Moq.Protected; 

Затем вызовите Protected() на свой макет, после чего вы можете использовать общий Setup<> с типом возвращаемого значения вашего метода.

var mock = new Mock<MyClass>(); 
mock.Protected() 
    .Setup<int>("MyProtectedGetIntMethod") 
    .Returns(1); 

Если метод ничего не возвращает, то используйте необщего Setup().

0

Согласно документации в Quickstart

если вам нужен соответствующий параметр, вы MUST использование ItExpr вместо It

// at the top of the test fixture 
using Moq.Protected; 

// in the test 
var mock = new Mock<Invitation> { CallBase = true }; 

// if you need argument matching, you MUST use ItExpr rather than It 
// planning on improving this for vNext 
mock.Protected() 
    .Setup<Book>("AddBook", ItExpr.IsAny<Book>()); 
+0

Спасибо Nkoi, попробуем. – BeHappy