2016-09-09 1 views
1

Ich habe echte Probleme mit Spott, wenn es um EF geht (Version 6, für was es wert ist).Spott mit Entity Framework und TypeMock

Dies ist die Methode, die ich zu Test versuchen:

public async Task<bool> IsSurveyComplete(Guid entityRef) 
    { 
     using (MyDbEntities context = new MyDbEntities()) 
     { 
      MyEntity entity = await context.MyEntities.FindAsync(entityRef); 
      // do stuff 
     } 
    } 

ich zu fälschen „Einheit“ benötigen, aber ich erkennen, dass es viel zu tun Isolate.Fake.Instance nicht, nur versucht, da eigentlich ein ObjectProxy anstelle einer Instanz vom Typ MyEntity. Ich entdeckte, dass die Art und Weise, dies zu umgehen, war, den context.Configuration.ProxyCreationEnabled auf false zu setzen. Dies funktioniert jedoch nicht, wenn ich es irgendwo außer im Konstruktor mache. Wenn ich versuche, die DbContextConfiguration zu fälschen, verwendet sie immer noch Proxys.

So schuf ich einen neuen Konstruktor verwendet werden, wenn Tests:

public MyDbEntities(bool useProxy) 
     : base("name=MyDbEntities") 
    { 
     this.Configuration.ProxyCreationEnabled = useProxy; 
    } 

und dann, in meinem Test:

Isolate.WhenCalled(() => new MyDbEntities()).WillReturn(new MyDbEntities(false)); 

Allerdings ist die ProxyCreationEnabled Eigenschaft noch auf true gesetzt, wenn ich Fügen Sie nach der using-Anweisung in der IsSurveyComplete-Methode einen Haltepunkt ein.

Ich habe auch versucht (unter vielen, vielen anderen Dingen):

var fakeContext = new MyDbEntities(false); 
    Isolate.Swap.AllInstances<MyDbEntities>().With(fakeContext); 

Auch wenn ich mit einem Breakpoint zu untersuchen, ProxyCreationEnabled wahr ist.

Ich bin dabei, auf TypeMock zu verzichten!

+0

Können Sie bitte Laden Sie Ihren Code von "IsSurveyComplete" und Ihren Test hoch? –

Antwort

2

declaimer: ich arbeite in Typemock

Sie eine falsche Funktion von Typemock verwenden, sollten Sie verwenden:

var fakeContext = Isolate.fake.NextInstance<MyDbEntities>(); 
Isolate.whenCalled(()=>fakeContext.MyEntities). 
    WillReturnCollectionValuesOf(listOfEntities.AsQueryable()); 

statt:

var fakeContext = new MyDbEntities(false); Isolate.Swap.AllInstances<MyDbEntities>().With(fakeContext);