2014-06-24 11 views
22

Ben (PilsnerContext bir DBContext sınıftır) Aşağıdaki sınıfları:Mock DbContext.set <T> .Add() Ef6'yı

public abstract class ServiceBase<T> : IService<T> where T: class, IEntity 
{ 
    protected readonly PilsnerContext Context; 

    protected ServiceBase(PilsnerContext context) 
    { 
     Context = context; 
    } 

    public virtual T Add(T entity) 
    { 
     var newEntity = Context.Set<T>().Add(entity); 
     Context.SaveChanges(); 
     return newEntity; 
    } 
} 

public class ProspectsService : ServiceBase<Prospect> 
{ 
    public ProspectsService(PilsnerContext context) : base(context){} 

} 

Ve alay Ekleme yöntemi bir birim testi yapmaya çalışıyorum bağlam gibi:

[TestClass] 
public class ProspectTest 
{ 
    [TestMethod] 
    public void AddProspect() 
    { 
     var mockProspect = new Mock<DbSet<Prospect>>(); 
     var mockContext = new Mock<PilsnerContext>(); 

     mockContext.Setup(m => m.Prospects).Returns(mockProspect.Object); 

     var prospectService = new ProspectsService(mockContext.Object); 

     var newProspect = new Prospect() 
     { 
      CreatedOn = DateTimeOffset.Now, 
      Browser = "IE", 
      Number = "1234567890", 
      Visits = 0, 
      LastVisitedOn = DateTimeOffset.Now 
     }; 

     prospectService.Add(newProspect); 

     mockProspect.Verify(m=>m.Add(It.IsAny<Prospect>()), Times.Once); 
     mockContext.Verify(m=>m.SaveChanges(), Times.Once); 
    } 
} 

Ama assert: Ben Context.s kullandığım için

mockProspect.Verify(m=>m.Add(It.IsAny<Prospect>()), Times.Once); 

başarısız mı

sanırım olduğunu Add yönteminde Context.Prospects.Add() yerine Ekle() ancak bu testi geçmek için doğru yol nasıl?

istisnadır: önceden

Expected invocation on the mock once, but was 0 times: m => m.Add(It.IsAny<Prospect>()) No setups configured. No invocations performed. 

teşekkürler. Sadece dönmek için kurulum eksik olduğunu

+3

+1, SO'ya hoş geldiniz! –

+0

Teşekkür ederim Patrick! – ferflores

+0

[Varlık Framework 6 Async yöntemleri nasıl taklit edilir?] Olası kopyası (http://stackoverflow.com/questions/21062745/how-to-mock-entity-framework-6-async-methods) –

cevap

5

.

public interface IPilsnerContext 
    { 
     DbSet<T> Set<T>() where T : class; 
    } 

bunu alay olabilir Böylece gibi

How to mock Entity Framework 6 Async methods?

DBContext bir arayüz oluşturma:

Bunun için burada bir çözüm buldum.

Teşekkürler!

Bu benim ilk sorum btw, bu soruyu çoğaltılan veya bir şey olarak işaretleyebilir miyim emin değilim. İyi yazılmış bir ilk soru için

+0

sorununun cevabı olmalıdır. Bu soru oldukça yakın, sorunuzu muhtemel bir kopya olarak işaretleyeceğim. Sizinki bağlandığınız sorunun bir alt kümesidir, bu yüzden haklı olduğunu düşünüyorum. –

18

görünüyor senin DbSet:

Ben senin çözüm Patrick Quirk çalıştı ama ben DbContext.Set sanal olmadığını bildiren bir hata başlamıştı
mockContext.Setup(m => m.Set<Prospect>()).Returns(mockProspect.Object); 
+1

'DbSet.Set () 'sanal olmayan bir yöntemdir. – haim770

+0

[Dokümanlar] (http://msdn.microsoft.com/en-us/library/gg696521%28v=vs.113%29.aspx) yanlış yönteme bakmadıkça öyle olduğunu söylüyor. Ben EF kullanıcısı değilim, bu yüzden tamamen yanlış olabilirim. –

+4

Görünüşe göre, bu yöntem, [bu taahhüt] 'te (http://entityframework.codeplex.com/SourceControl/changeset/6dc8879b13f54382eb087dd010636bebc15fdc69), yani EF 6.1.0 ve sonrasında sanal olarak yapılmıştır. Sadece delirmediğimden emin olmak için! –