Подтвердить что ты не робот

Как получить доступ к значениям параметров в Returns() с помощью FakeItEasy?

У меня есть интерфейс к factory, который используется для создания некоторых объектов данных.

interface IFactory
{
    IData Create (string name, string data);
}

interface IData
{
    // ....
}

class Data : IData
{
    public Data (string name, string data)
    {
        // .....
    }
}

Мне нужно создать mock factory для перехода к другому модулю, и этот модуль будет использовать этот макет для создания данных.

Для быстрого примера простой модуль выглядит так:

class QuickModule
{
    private readonly IFactory _factory;

    public QuickModule (IFactory factory)
    {
        _factory = factory;
    }

    public IEnumerable<IData> GetData ()
    {
        yield return _factory.Create ("name1", "abc");
        yield return _factory.Create ("name2", "def");
    }
}

Итак, factory вызывается два раза с двумя наборами параметров.

Используя Moq, это легко:

var factoryMock = new Mock<IFactory> ();
factoryMock.Setup (x => x.Create (It.IsAny<string> (), It.IsAny<string> ()))
                    .Returns ((string name, string data) => new Data (name, data));
var module = new QuickModule (factoryMock.Object);
var list = module.GetData ();

Однако использование FakeItEasy не представляется возможным:

var factory = A.Fake<IFactory> ();
A.CallTo (() => factory.Create (A<string>.Ignored, A<string>.Ignored))
              .Returns (new Data (???, ???));
var module = new QuickModule (factory);
var list = module.GetData ();

Как получить доступ к значениям параметров?

4b9b3361

Ответ 1

Хорошо, похоже, что ReturnsLazily() является ответом.

Итак, вот что я сделал:

var factory = A.Fake<IFactory> ();
A.CallTo (() => factory.Create (A<string>.Ignored, A<string>.Ignored))
              .ReturnsLazily ((string name, string data) => new Data (name, data));
var module = new QuickModule (factory);
var list = module.GetData ();

Это рекомендуемый способ или есть другой?

Ответ 2

Здесь, как вернуть объект, который вы передали в метод.

ManufacturedPart inputPart;

A.CallTo(() => partRepo.InsertPart(A<ManufacturedPart>._))
  .ReturnsLazily(x => inputPart = x.Arguments.Get<ManufacturedPart>("part"));