如何使用FakeItEasy获取Returns()中参数的值?

32

我有一个接口用于创建一些数据对象的工厂。

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

interface IData
{
    // ....
}

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

我需要创建一个模拟工厂,以便传递给另一个模块,并且该模块将使用此模拟来创建数据。

举个简单的例子,一个简单的模块如下:

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");
    }
}
所以,该工厂使用两组参数进行了两次调用。
使用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 ();

我如何访问参数值?

2个回答

57

好的,似乎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 ();

这是推荐的方式吗,还是有其他方式?


5
这是推荐的方式! - Patrik Hägne

3
这里是如何返回您传递到方法中的对象。
ManufacturedPart inputPart;

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接