2015-02-24 1 views
3

меня есть интерфейсFakeItEasy - Имея интерфейс поддельной наследовать от абстрактного в то время как доля же наследование интерфейса

public interface IInterface { void DoSomething(); } 

Другой интерфейс

public interface IOtherInterface : IInterface { } 

Абстрактный класс

public abstract class AbstractClass : IInterface 
{ 
    public void DoSomething() 
    { 
     Console.WriteLine("Got here"); 
    } 
} 

Я m записывая единичный тест и подделку IOtherInterface. В абстрактном классе уже содержатся полезные методы, которые я бы хотел использовать для моего модульного теста. Как мне сделать мой A.Fake<IOtherInterface>(); наследовать от AbstractClass?

Это то, что я пробовал до сих пор, но он не работает - AbstractClass.DoSomething не попадает.

 IOtherInterface fake = A.Fake<IOtherInterface>(builder => builder.Implements(typeof (AbstractClass))); 

     fake.DoSomething(); 

Конечно, если бы я сделать прокси, как:

 var abstractFake = A.Fake<AbstractClass>(); 
     A.CallTo(() => fake.DoSomething()).Invokes(abstractFake.DoSomething); 

     fake.DoSomething(); 

... все работает, как я хотел. Есть ли встроенный механизм для достижения этого, так что мне не нужен этот прокси-сервер abstractFake?

UPDATE

мне нужно IOtherInterface, потому что у меня есть класс клиента, который нуждается в том, что IOtherInterface в зависимости:

class Consumer 
{ 
    public Consumer(IOtherInterface otherInterface) 
    { 
     otherInterface.DoSomething(); 
    } 
} 
+0

Он делает, однако переменная 'abstractFake' будет иметь тип' AbstractClass', а не 'IOtherInterface'. Мне нужно 'IOtherInterface'. См. Обновление :) –

+0

Спасибо, что подняли этот вопрос. Как вы можете видеть из ответа Блэра Конрада, в результате были подняты две проблемы проекта, и это здорово! –

+0

@AdamRalph Я буду честен, мне удавалось увидеть активность Блэра, зайдя и создав эти проблемы проекта, чего вы обычно не видите. Обычно даже соавторы проекта просто скажут «go file a bug». Во всяком случае, я рад, что косвенно внес свой вклад :) –

ответ

3
var fake = (IOtherInterface) A.Fake<AbstractClass>(builder => 
           builder.Implements(typeof(IOtherInterface))); 
A.CallTo(() => fake.DoSomething()).CallsBaseMethod(); 
fake.DoSomething(); 

Implements предназначен для работы только с интерфейсами, так что правильный путь использовать его для подделки интерфейса или класса и использовать Implements для добавления дополнительного интерфейса. Я думаю, что он должен был жаловаться на вас, поэтому я поднял complain when IFakeOptionsBuilder.Implements is passed a non-interface, , который был исправлен в FakeItEasy 2.0.0.

CallsBaseMethod обеспечит выполнение метода Abstract class.

Я бы рекомендовал builder.CallsBaseMethods(), но это не позволяет перенаправить вызов. Я думаю, это потому, что он перенаправляет AbstractClass.DoSomething, но когда мы накладываем фальшивку на IOtherInterface и вызываем DoSomething, это не соответствует. Я поднял investigate interaction between Implements and CallsBaseMethods.

+0

Спасибо @blairconrad за помощь, за то, что вы активно поднимаете жалобу/расследование. Я не знаю о выпуске FakeItEasy, но я с нетерпением жду, чтобы эти проблемы были исправлены. :) –

+2

@JoaoMilasch, FakeItEasy обычно [выпускает часто] (https://www.nuget.org/packages/FakeItEasy), но, как и во многих проектах с открытым исходным кодом, расписание зависит от наличия основной команды и ставки взносов от сообщества. Я бы не обязательно ожидал решения _speedy_, поскольку основная команда участвует в предстоящем выпуске 2.0, и эти проблемы довольно незначительны. Один из них эффективно «добавляет предупреждающее сообщение, чтобы пользователи знали, что они использовали« Неправильные инструменты », а другой - довольно угловой случай - взаимодействие между двумя не второстепенными функциями и обходное решение. –

+0

достаточно справедливо. В любом случае, я в порядке с работой. Спасибо за помощь. –

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