如何使用FakeItEasy访问Returns()中的参数值?

Sté*_*écy 23 c# fakeiteasy

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

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

interface IData
{
    // ....
}

class Data : IData
{
    public Data (string name, string data)
    {
        // .....
    }
}
Run Code Online (Sandbox Code Playgroud)

我需要创建一个模拟工厂来传递给另一个模块,这个模块将使用这个模拟来创建数据.

简单来说,一个简单的模块如下所示:

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");
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,工厂被调用两次,有两组参数.

使用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 ();
Run Code Online (Sandbox Code Playgroud)

但是使用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 ();
Run Code Online (Sandbox Code Playgroud)

如何访问参数值?

Sté*_*écy 46

好吧,似乎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 ();
Run Code Online (Sandbox Code Playgroud)

这是推荐的方式还是另一种?

  • 这是推荐的方式! (5认同)