2012-11-06 1 views
20

J'ai une interface avec une usine utilisée pour créer des objets de données.Comment accéder à la valeur des paramètres dans Returns() en utilisant FakeItEasy?

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

interface IData 
{ 
    // .... 
} 

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

Je dois créer une usine maquette pour passer à un autre module et ce module utilisera cette maquette pour créer des données.

Pour un exemple rapide, un module simple ressemble à:

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

Ainsi, l'usine est appelée deux fois avec deux ensembles de paramètres.

En utilisant Moq, c'est facile:

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

Cependant, l'utilisation FakeItEasy cela ne semble pas être possible:

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

Comment puis-je accéder aux valeurs des paramètres?

Répondre

40

Ok, il semblerait que ReturnsLazily() soit la réponse.

Alors, voici ce que je faisais:

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

Est-ce la façon recommandée ou est-il un autre?

+5

C'est la méthode recommandée! –

0

Voici comment retourner l'objet que vous avez passé dans la méthode.

ManufacturedPart inputPart; 

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