2013-01-17 15 views
5

Ho un oggetto complesso che sto cercando di simulare.FakeItEasy tipi di tipi nidificati profondi

interface IContext 
{ 
    User User { get; } 
} 

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

ma ho l'eccezione seguente:

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

Tutti i tipi nidificati sono proprietà, e sono semplici tipi anemici con get; set; modificatori di proprietà. E quando guardo il debugger, sono tutti falsi.

C'è un modo per impostare l'ultima proprietà della catena ed evitare l'installazione di tutti quelli precedenti?

+0

sono la proprieta su 'user' virtuale? In tal caso potresti pubblicare il codice sorgente per 'Utente'? – Xharze

+0

No. Né l'Utente né l'Abbonamento sono virtuali. È il codice dall'assemblaggio compilato. –

+2

FakeItEasy non può prendere in giro metodi non virtuali, quindi è necessario risolverlo per costruire l'oggetto da solo. Qualcosa come la risposta sotto farebbe il trucco. – Xharze

risposta

3

Se gli oggetti sono abbastanza anemica, si potrebbe desiderare di dare AutoFixture un andare:

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. Al fine di farlo funzionare, i vostri oggetti personalizzati necessario avere costruttore pubblico e, preferibilmente, evitare l'uso di interfacce (ma che può essere mitigato con estensioni automatiche di, come AutoFakeItEasy).
  2. Il metodo .Build fornisce API fluente di personalizzare gli oggetti autogenerazione, in modo che il casualità può essere controllato