2013-11-20 3 views
3

У меня есть объект, управляющий базой данных как зависимость моего UUT (Unit Under Test). Поэтому я хочу сделать это как строгий макет, потому что я также хочу убедиться, что UUT не вызывает никаких других методов, которые могут привести к изменению db.Rhino Mocks 'Expect' с FakeItEasy

В носорог издевается я сделал следующее:

  1. Я сделал strictmock из БД объекта
  2. я сделал оговорку .Expect в Устройте
  3. Я назвал VerifyAllExpectations в Assert

Однако, когда я хочу сделать это в FakeItEasy, я не могу найти, как это сделать без дублирования кода. Я попытался помещать части CallsTo() + MustHaveHappened() в Arrange, но тогда мой тест завершился неудачно. Если я помещу части CallsTo() + MustHaveHappened() в Assert, тогда мой тест также завершится неудачей, поскольку неожиданные вызовы были сделаны для строгой подделки. Можно ли это сделать, не помещая вызов CallsTo в Arrange и Assert?

+0

тестируемых = испытываемого устройство? –

+0

Да, UUT = Unit Under Test –

+0

Я вижу, спасибо. Раньше я этого не слышал. Обычно я использую SUT - System Under Test. –

ответ

5

Вы можете добиться того, что со следующими проверками:

var service = A.Fake<IService>(); 

testedObject.CallService("data"); 

// verify your specific call to .PostData 
A.CallTo(() => service.PostData("data")).MustHaveHappened(Repeated.Exactly.Once); 
// verify that no more than 1 call was made to fake object 
A.CallTo(service).MustHaveHappened(Repeated.Exactly.Once); 

Перегрузка A.CallTo(object) позволяет сделать общие настройки/проверки на всех и любой из поддельных методов объекта.

+0

+1 это работает. FYI Я опросил владельцев FIE, чтобы узнать, есть ли более элегантный способ решить эту проблему: https://github.com/FakeItEasy/FakeItEasy/issues/198 –

+0

И я ответил @AdamRalph: «Почему бы просто не сосать '() => service.PostData ...)' в переменную и использовать ее в Arrange and Assert? Это еще два вызова, как в этом ответе, но (я думаю) немного более идиоматический FIE. –

6

Пока ответа от @jimmy_keen будет работать (я даже upvoted его) более идиоматическое использование FakeItEasy будет:

// Arrange 
var service = A.Fake<IService>(o => o.Strict()); // only allows configured calls 
A.CallTo(() => service.PostData("data")).DoesNothing(); // allow a specific call 

// Act 
testedObject.CallService("data"); 

// Assert 
A.CallTo(() => service.PostData("data")).MustHaveHappened(Repeated.Exactly.Once); 

--- UPDATE ---

С помощью @blairconrad более в https://github.com/FakeItEasy/FakeItEasy/issues/198#issuecomment-29145440 я думаю, что это опрятный способ сделать это без дублирования:

// Arrange 
var service = A.Fake<IService>(o => o.Strict()); // only allows configured calls 
var expectedCall = A.CallTo(() => service.PostData("data")); 
expectedCall.DoesNothing(); // allow the call 

// Act 
testedObject.CallService("data"); 

// Assert 
expectedCall.MustHaveHappened(Repeated.Exactly.Once); 
+0

«Это можно сделать без поместив вызов CallsTo в Arrange и Assert? » Я знал эту версию, и мой вопрос был именно об этом. –

+0

У вас есть точка с дублированием кода. В настоящее время нет никакого способа добиться этого со строгой подделкой без дублирования кода. Я снова открыл проблему в FakeItEasy, чтобы обсудить дальнейшие https://github.com/FakeItEasy/FakeItEasy/issues/198#issuecomment-29138957 –

+0

Вау, поэтому CallTo возвращает «объект вызова», который может быть проверен позже , Интересно, уделено внимание. –