我有一个工厂接口,用于创建一些数据对象。
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 ();
如何访问参数值?
答案 0 :(得分:44)
好的,似乎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 ();
这是推荐的方式还是另一种?
答案 1 :(得分:0)
以下是如何返回传递给方法的对象。
{{1}}