2013-06-25 5 views
5

Я пытаюсь получить доступ к издеваемому (через Nsubstitute) классу, который был введен в конструктор.Автохимия + NSubstitute: Замораживание макета?

я использовал следующий код

var fixture = new Fixture() 
    .Customize(new AutoNSubstituteCustomization()); 

var sut = fixture.Create<MyService>(); 

тестируемой создается успешно, и высмеивал версию интерфейса под названием «IFileUtils» вводится на конструктор «MyService».

но я нужен доступ к нему, так что после прочтения я полагаю, что нужно заморозить объект, так у меня есть доступ к нему, как так

var fileUtilMock= fixture.Freeze<Mock<IFileUtils>>(); 

Но этот код я считаю, синтаксис Moq как «Мока» не может быть найден.

Обычно для создания Nsubstitute класса вы делаете следующее

var fileUtilMock= Substitute.For<IFileUtils>(); 

, но это, конечно, не замерзает поэтому его не использовали и вводили в конструктор.

Может ли кто-нибудь помочь?

ответ

10

на основе выводов из this Mocking tools comparison article by Richard Banks, и как работает AutoMoq, я считаю:

  • NSubstitute не имеет разделение между Mock и Mock.Object как Moq делает
  • AutoFixture.Auto * Расширения крюком в SpecimenBuilderNode для реализации [mocked] реализации интерфейсов, т.е.fixture.Create<IFileUtils>() должен работать
  • Замораживание эквивалентно var result = fixture.Create<IFileUtils>(); fixture.Inject(result)

Поэтому вы должны просто быть в состоянии сказать:

var fileUtilMock = fixture.Freeze<IFileUtils>(); 
+0

@ daniel hilgarth - любой из моих выводов любой хороший: D Не стесняйтесь редактировать столько, сколько захотите и/или скажите мне, чтобы удалить сообщение! –

6

Вы должны Заморозить экземпляр с автоматическим высмеиванием перед созданием экземпляра MyService.

Update:

Как Рубен Bartelink указывает, с NSubstitute все, что вам нужно сделать, это:

var fixture = new Fixture() 
    .Customize(new AutoNSubstituteCustomization()); 

var substitute = fixture.Freeze<IFileUtils>(); 

..и затем использовать методы расширения NSubstitute в.

Таким образом, тот же, замороженный экземпляр будет поставляться в конструктор MyService.

Пример:

Для интерфейса IInterface:

public interface IInterface 
{ 
    object MakeIt(object obj); 
} 

Все, что вам нужно сделать с это:

var substitute = fixture.Freeze<IInterface>(); 
substitute.MakeIt(dummy).Returns(null); 

Returns на самом деле метод расширения в NSubstitute.

+0

Но это я считаю для Moq, я использую NSubstitute и Mock - Mock не найден или существует .. – Martin

+0

Вы верны. Я только что обновил ответ. –