2012-11-06 6 views
20

मेरे पास कुछ डेटा ऑब्जेक्ट्स बनाने के लिए उपयोग किए जाने वाले कारखाने के लिए एक इंटरफ़ेस है।FakeItEasy का उपयोग कर रिटर्न() में पैरामीटर मान तक पहुंच कैसे प्राप्त करें?

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

मैं पैरामीटर मान कैसे उपयोग कर सकते हैं?

उत्तर

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")); 
संबंधित मुद्दे