2014-06-24 7 views
22

मैं निम्नलिखित वर्गों (जहां PilsnerContext एक DbContext वर्ग है):नकली DbContext.set <T> .Add() EF6

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){} 

} 

और मुझे मजाक विधि जोड़ें की एक इकाई परीक्षण बनाने के लिए कोशिश कर रहा हूँ संदर्भ की तरह:

[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); 
    } 
} 

लेकिन ज़ोर:

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

विफल हो रहा है, मुझे लगता है है, क्योंकि मैं Context.s उपयोग कर रहा हूँ et()। Context.Prospects.Add() के बजाय जोड़ें() जोड़ें विधि में जोड़ें लेकिन इस परीक्षण को पास करने का सही तरीका कैसा है?

अपवाद है:

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

अग्रिम धन्यवाद।

+3

+1 एक अच्छी तरह से लिखे गए पहले प्रश्न के लिए +1, आपका स्वागत है SO! –

+0

धन्यवाद पैट्रिक! – ferflores

+0

संभावित डुप्लिकेट [एंटीटी फ्रेमवर्क 6 असिनक विधियों का नकल कैसे करें?] (Http://stackoverflow.com/questions/21062745/how-to-mock-entity-framework-6-async-methods) –

उत्तर

5

मैं अपने समाधान पैट्रिक क्विर्क कोशिश की, लेकिन मैं मुझे बता कि DbContext.Set आभासी नहीं है एक त्रुटि हो रही थी।

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

इस तरह मैं यह नकली सकता है की तरह

How to mock Entity Framework 6 Async methods?

DbContext की एक अंतरफलक बनाना:

मुझे लगता है कि यहाँ के लिए समाधान मिल गया।

धन्यवाद!

यह मेरा पहला सवाल है btw, मुझे यकीन नहीं है कि मैं इस प्रश्न को डुप्लिकेट या कुछ के रूप में चिह्नित कर सकता हूं।

+0

का उत्तर होना चाहिए यह प्रश्न बहुत करीब है, मैं आपके प्रश्न को संभावित डुप्लिकेट के रूप में ध्वजांकित करूंगा। आपका प्रश्न उस प्रश्न का सबसेट है जिसे आप लिंक करते हैं, इसलिए मुझे लगता है कि योग्यता प्राप्त होती है। –

18

ऐसा लगता है कि तुम सिर्फ वापस जाने के लिए सेटअप भूल रहे हैं की तरह अपने DbSet:

mockContext.Setup(m => m.Set<Prospect>()).Returns(mockProspect.Object); 
+1

'DbSet.Set () 'एक गैर वर्चुअल विधि है। – haim770

+0

[दस्तावेज़] (http://msdn.microsoft.com/en-us/library/gg696521%28v=vs.113%29.aspx) कहें, यह तब तक है जब तक कि मैं गलत विधि को नहीं देख रहा हूं। मैं एक ईएफ उपयोगकर्ता नहीं हूं, इसलिए मैं पूरी तरह गलत हो सकता हूं। –

+4

स्पष्ट रूप से इस विधि को [इस प्रतिबद्ध] में वर्चुअल बनाया गया था (http://entityframework.codeplex.com/SourceControl/changeset/6dc8879b13f54382eb087dd010636bebc15fdc69), जो ईएफ 6.1.0 और बाद में है। बस सुनिश्चित कर रहा हूँ कि मैं पागल नहीं हूँ! –

संबंधित मुद्दे