2013-01-17 14 views
5

मेरे पास एक जटिल वस्तु है जिसे मैं नकली करने की कोशिश कर रहा हूं।FakeItEasy गहरे घोंसले प्रकार

interface IContext 
{ 
    User User { get; } 
} 

A.CallTo(
    () => _fakeContext.User.Subscription.Attributes) 
    .Returns(new List<Attribute>()); 

लेकिन मैं अगले अपवाद:

The current proxy generator can not intercept the specified method for the following reasons: - Non virtual methods can not be intercepted

सभी नेस्टेड प्रकार के गुण हैं, और वे get; set; संपत्ति संशोधक के साथ सरल कमजोर प्रकार हैं। और जब मैं डीबगर में देखता हूं तो वे सभी नकली हैं।

क्या श्रृंखला के अंतिम संपत्ति को स्थापित करने और पिछले सभी को सेट करने से बचने का कोई तरीका है?

+0

नियंत्रित किया जा सकता 'User' पर संपत्ति आभासी हैं? यदि ऐसा है तो आप 'उपयोगकर्ता' के लिए स्रोत कोड पोस्ट कर सकते हैं? – Xharze

+0

नहीं। न तो उपयोगकर्ता और न ही सदस्यता वर्चुअल हैं। यह संकलित असेंबली से कोड है। –

+2

FakeItEasy गैर आभासी तरीकों का नकल नहीं कर सकता है, इसलिए आपको ऑब्जेक्ट को स्वयं बनाने के लिए हल करना होगा। नीचे दिए गए उत्तर की तरह कुछ चाल चल जाएगा। – Xharze

उत्तर

3

अपने वस्तुओं काफी कमजोर हैं, तो आप AutoFixture एक जाना देने के लिए चाहते हो सकता है:

var fake = A.Fake<>(); 
var fixture = new Fixture(); 
// If it's possible [1], AutoFixture will generate entire object graph 
var user = fixture.CreateAnonymous<User>(); 
// Since data will be random [2], you can overwrite properties as you like 
user.User.Subscription.Attributes = new List<Attributes>(); 
A.CallTo(() => fake.User).Returns(user); 
  1. आदेश में यह काम करने के लिए, अपने कस्टम वस्तुओं सार्वजनिक निर्माता है और अच्छा होगा यदि इंटरफेस का उपयोग कर से बचने के (करने की जरूरत है लेकिन इसे ऑटो-मॉकिंग एक्सटेंशन, जैसे AutoFakeItEasy के साथ कम किया जा सकता है)।
  2. .Build विधि वस्तुओं autogeneration अनुकूलित करने के लिए धाराप्रवाह एपीआई प्रदान करता है, इसलिए अनियमितता
संबंधित मुद्दे