2015-02-12 8 views
2

У меня есть вызов фабричного интерфейса, который создает в обработчике IMachine. Это возвращено IMachine с фабрики имеет методы, которые могут быть соединены вместе, чтобы создать себя внутри класса строителя. Проблема, с которой я столкнулся с FakeItEasy, заключается в том, что она только распознала первый вызов (который равен WithSpeeds), если я не настроил каждый вызов метода, чтобы вернуть подделку IMachine. Есть ли способ не настраивать каждый отдельный вызов или иметь FakeItEasy распознавать каждый вызов метода в цепочке? Я знаю, что я должен делать что-то неправильное, потому что, если я использую OrderAssertions и не выполняю заказ специально, не настраивая свой поддельный компьютер, он показывает, что вызовы были сделаны для всех методов. Спасибо за помощь.C# FakeItEasy и цепочка методов: распознается только первый вызов

Часть Метод командной хендлера

public void Handle(FooCommand commandParm) 
{ 
    var entity = new Entity.Builder 
    { 
    Machine = _factory.CreateMachine(commandParm.MachineName) 
       .WithSpeeds(commandParm.ProcessingSpeed, commandParm.StartupSpeed, commandParm.ShutDownSpeed) 
       .WithOils(commandParm.Lubrication, commandParm.FinishingOil) 
    }; 
} 

Тест

[TestMethod] 
public void HandleSetMachineSettings_should_build_machine() 
{ 
    // Arrange 
    var settings = CommandUtilities.ReturnFooCommand(); 
    var _factory = A.Fake<IMachineFactory>(); 
    var machine = A.Fake<IMachine>(); 
    A.CallTo(() => _factory.CreateMachine(settings.MachineName)).Returns(machine); 

    // Act 
    _handler.Handle(settings); 

    // Assert 
    machine.Should().NotBeNull(); 
    A.CallTo(machine).Where(x => x.Method.Name.Equals("set_MachineNumber")).WhenArgumentsMatch(arg => arg.Get<int>(0) == settings.MachineNumber).MustHaveHappened(Repeated.Exactly.Once); 
    A.CallTo(() => machine.WithSpeeds(commandParm.ProcessingSpeed, commandParm.StartupSpeed, commandParm.ShutDownSpeed)).MustHaveHappened(Repeated.Exactly.Once); 
    A.CallTo(() => machine.WithOils(commandParm.Lubrication, commandParm.FinishingOil)).MustHaveHappened(Repeated.Exactly.Once); 
} 

ответ

4

я считать, что WithSpeeds и WithOils оба возвращают IMachine, да?

Проблема заключается в том:

  1. _factory.CreateMachine возвращает один IMachine, machine от вашей установки
  2. machine.WithSpeeds возвращает подделкой IMachine что FakeItEasy составляет. Это неmachine, но это другая подделка, называют его «machine2»
  3. machine2.WithOils возвращается еще одна фальшивки машины

Ваш Утверждай блок предполагает, что вы ожидали, же машины возвращаются на каждом шаг строительной цепочки. Попробуйте вставить

A.CallTo(machine) 
    .WithReturnType<IMachine>() 
    .Returns(machine); 

после A.CallTo(() => _factory.CreateMachine()).Returns(machine);

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

+0

спасибо! Это именно то, что я искал. Я всегда могу рассчитывать на то, что вы поможете мне с вопросами «FakeItEasy». Я приближаюсь к 900 испытаниям по этому проекту, и большинство из них благодаря «FakeitEasy», поэтому я ценю тяжелую работу от вас и вашей команды. –

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

  • Нет связанных вопросов^_^