2011-02-03 13 views
5

Я пытаюсь понять, как работает этот Mock (используя фреймворк Moq), но я немного запутался в методах, которые возвращают void.Moq a void method

Исходный объект имеет следующие методы/свойства:

void Add(Person entity); 
void Save(); 
IQueryable<Person> Persons; 

Метод Add называет InsertOnSubmit (это Linq к SQL), и метод Сохранить вызовы Context.SubmitChanges(). Свойство Person возвращает объект Table<News>.

Я не уверен, как я обманываю эти методы, поскольку я, очевидно, не могу использовать Returns().

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

+0

Без дальнейшего контекста немного сложно дать хороший ответ. – mfloryan

ответ

3

Это зависит от того, что вы намерены проверить.

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

В случае, когда вы описываете, вы, по-видимому, тестируете класс, который использует класс со способами и свойствами, упомянутыми выше. Чтобы проверить взаимодействия, вы хотите проверить, вызван ли метод Add с ожидаемыми параметрами, вызывается метод Save и что для чтения результатов используется свойство Persons. Это может быть достигнуто следующим образом:

var mockedClass = new Mock<IDaoClass>(); 
var classUnderTest = ... 

mockedClass.SetupGet(m => m.Persons).Returns(new List<Person>().AsQueryable()); 

classUnderTest.DoSomething(); 

mockedClass.Verify(m => m.Add(It.IsAny<Person>())); 
mockedClass.Verify(m => m.Save()); 

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

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