2012-11-06 34 views
20

我有一個用於創建一些數據對象的工廠的接口。如何使用FakeItEasy訪問Returns()中的參數值?

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"); 
    } 
} 

因此,工廠有兩組參數調用兩次。

使用起訂量,這很容易:

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(); 

如何訪問這些參數值?

回答

40

好吧,它似乎是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

這是推薦的方法! –

0

以下是如何返回您傳入方法的對象。

ManufacturedPart inputPart; 

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