2013-05-23 2 views
3

Я новичок в модульном тестировании и делаю некоторые эксперименты с xUnit и AutoFixture.AutoFixture: Поставьте аргумент конструктора Func в качестве аргумента конструктора

Это конструктор класса я хочу, чтобы тест:

public PokerClientIniGenerateCommand(
    Func<TextWriter> writerCreator, 
    FranchiseInfo franchise) 
{ 
    // some code here 
} 

Я делаю это:

public abstract class behaves_like_poker_client_ini_generate_command : Specification 
{ 
    protected PokerClientIniGenerateCommand commandFixture; 

    protected behaves_like_poker_client_ini_generate_command() 
    { 
     var fixture = new Fixture(); 
     commandFixture = fixture.Create<PokerClientIniGenerateCommand>(); 
    } 
} 

Я не знаю, как я могу установить параметры конструктора (в основном первый параметр - часть func).

В моей бизнес-логике я инстанцирование этого класса, как это:

new PokerClientIniGenerateCommand(
    () => new StreamWriter(PokerClientIniWriter), 
    franchise)); 

так в моем тесте я должен назвать FUNC так:

() => new StringWriter(PokerClientIniWriter) 

Но как я могу установить это с помощью AutoFixture. Любая помощь будет примером.

ответ

6

From version 2.2 и выше, AutoFixture ручки Func и Action делегатов автоматически.

В вашем примере, вы только придать StringWriter типа как TextWriter типа, как показано ниже:

fixture.Inject<TextWriter>(new StringWriter()); 

Вы можете прочитать больше о Inject методе here.

+0

Что делать, если Func принимает параметр? т.е.: '' 'Func ' ''. Можете ли вы сказать Autofixture, что делать с параметром? – bj0

+1

С 'Func func = x => new StringWriter();' вы можете сделать 'fixture.Inject (func (fixture.Create ()));'. –

+0

Хорошо, да, когда я задал вопрос, я не понимал, что вы можете просто вставить Func <>, спасибо – bj0

-1

мне удалось это сделать:

fixture.Register<Func<TextWriter>>(() =>() => new StringWriter()); 
4

Как @NikosBaxevanis правильно указывает в своем ответе, AutoFixture может создать anonymous instances of any delegate type. Эти анонимных делегатов принимают форму динамически генерируемых методов.

Стратегия поколения, как это в настоящее время реализуется, по следующим правилам:

  1. Если подпись делегата является void, созданный метод не будет не оп.
  2. Если подпись делегата имеет возвращаемое значение T, созданный метод возвращает анонимный экземпляр T.

С учетом этих правил, в случае Func<TextWriter> было бы достаточно просто настроить создание анонимных TextWriter объектов с:

fixture.Register<TextWriter>(() => new StringWriter()); 
Смежные вопросы