6
साथ

मैं अपने ASP.NET वेब एपीआई 2.0 आवेदन में इकाई की रूपरेखा 6 कार्यों के लिए इकाई परीक्षण जोड़ने निम्नलिखित MSDN ट्यूटोरियल का उपयोग की प्रक्रिया में हूँ:यूनिट इकाई की रूपरेखा 6 परीक्षण IdentityDbContext

http://msdn.microsoft.com/en-us/data/dn314431

ट्यूटोरियल एप्लिकेशन के डीबीकॉन्टेक्स्ट क्लास के स्थान पर उपयोग करने के लिए एक इंटरफेस बनाने का सुझाव देता है। इस इंटरफ़ेस को तब पूरे एप्लिकेशन में उपयोग किया जाता है, जिससे नियंत्रकों को 'मॉक' परीक्षण संदर्भ का उपयोग करके परीक्षण किया जा सकता है।

public interface IApplicationDbContext : IDisposable 
{ 
    DbSet<Blog> Blogs { get; } 
    DbSet<Post> Posts { get; } 
    Task<int> SaveChangesAsync(); 
} 

दुर्भाग्य से इस ट्यूटोरियल मान लिया गया है:

public interface IBloggingContext 
{ 
    DbSet<Blog> Blogs { get; } 
    DbSet<Post> Posts { get; } 
    int SaveChanges(); 
} 

जैसा कि मैंने SaveChangesAsync() का उपयोग कर रहा बजाय, मैं नीचे एक करने के लिए इंटरफ़ेस को संशोधित किया है:

नीचे ट्यूटोरियल से सुझाव दिया इंटरफेस है कि संदर्भ में डीबीकॉन्टेक्स्ट का बेस क्लास है, जब मेरा पहचान क्लास क्लास के रूप में पहचान डीबी कॉन्टेक्स्ट का उपयोग करता है (नीचे देखें)। SaveChangesAsync() को कॉल करने का कोई तरीका नहीं है - जिसे मैं SaveChanges() के स्थान पर उपयोग कर रहा हूं - मेरे संदर्भ से, यह इंटरफ़ेस को सही ढंग से कार्यान्वित करने में असमर्थ है।

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>, IApplicationDbContext 
{ 
    public ApplicationDbContext() 
     : base("DefaultConnection", throwIfV1Schema: false) 
    { 

    } 

    public Task<int> SaveChangesAsync() 
    { 
     // No way to call DbContext.SaveChangesAsync() from here 
    } 
} 

किसी भी विचार या सुझाव की सराहना की जाएगी!

संपादित करें:

नीचे वर्ग है जो वर्तमान में उपयोग में हैं की प्रतियां हैं:

ApplicationDbContext

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>, IApplicationDbContext 
{ 
    public ApplicationDbContext() 
     : base("DefaultConnection", throwIfV1Schema: false) 
    { 

    } 

    public Task<int> SaveChangesAsync() 
    { 
     // Cannot resolve base.SaveChangesAsync() from here 
    } 

    public DbSet<Product> Products { get; set; } 
} 

IApplicationDbContext

public interface IApplicationDbContext 
{ 
    Task<int> SaveChangesAsync(); 
    DbSet<Product> Products { get; set; } 
} 

उदाहरण नियंत्रक निर्माता (जो इंटरफ़ेस का उपयोग करता)

protected BaseEntityController(IApplicationDbContext context) 
{ 
    db = context; 
} 

संपादित करें 2:

ऐसा लगता है वर्ग पदानुक्रम के साथ कुछ समस्या हो सकती है। नीचे एक और (उम्मीद संबंधित) है त्रुटि का निर्माण: जॉन ने उल्लेख किया

:

public class ApplicationUser : IdentityUser 

संपादित करें 3:

UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(db)); 

Error 2 Argument 1: cannot convert from 'IApplicationDbContext' to 'System.Data.Entity.DbContext' 

संदर्भ के लिए, मेरी ApplicationUser वर्ग IdentityUser का एक आधार वर्ग है , EDIT 2 में पोस्ट की गई त्रुटि की अपेक्षा की जानी चाहिए। दुर्भाग्यवश, इंटरफ़ेस (IAplicationDbContext) के बजाय पूरी तरह से संदर्भ (ApplicationDbContext) के लिए त्रुटि भी हुई।

समस्या अब हल हो गई है, लेकिन केवल समाधान से संकुल को अनइंस्टॉल करने और पुनर्स्थापित करने, विजुअल स्टूडियो को पुनरारंभ करने और फिर परियोजना को पुनर्निर्माण करने के द्वारा। मैं अभी भी इस मुद्दे के सटीक कारण से अनिश्चित हूं।

मैंने जॉन के उत्तर को सही के रूप में चिह्नित किया है, क्योंकि यह सामान्य परिस्थितियों में होगा।

उत्तर

8

MSDN hereIdentityDbContext डीबीकॉन्टेक्स्ट से विरासत में मिलता है, इसलिए यदि आपको सीधे कॉल करने की आवश्यकता है तो base.SaveChangesAsync काम करना चाहिए।

हालांकि, वास्तव में आपको उस विधि को लागू करने की आवश्यकता नहीं है, क्योंकि इसे पहले से ही "वास्तविक" संदर्भ में DbContext द्वारा कार्यान्वित किया गया है जब तक कि आप एक स्पष्ट इंटरफ़ेस कार्यान्वयन का उपयोग नहीं कर रहे हैं या अधिक कोड जोड़ रहे हैं (जो आप नहीं हैं उदाहरण)। आपको TestDbContext में कुछ लागू करने की आवश्यकता है क्योंकि यह डीबीकॉन्टेक्स्ट से विरासत में नहीं मिलेगा।

अगर मैं SaveChangesAsync लागू आप इस तरह की है के रूप में: अगर मैं या तो पूरी तरह से SaveChangesAsync के कार्यान्वयन को छोड़ देते हैं

Warning 1 'SOWorking.ApplicationDbContext.SaveChangesAsync()' hides inherited member 'System.Data.Entity.DbContext.SaveChangesAsync()'. To make the current member override that implementation, add the override keyword. Otherwise add the new keyword.

निर्माण कोई चेतावनी है:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>, IApplicationDbContext 
{ 
    public Task<int> SaveChangesAsync() 
    { 
     return base.SaveChangesAsync(); 

     // No way to call DbContext.SaveChangesAsync() from here 
    } 
} 

फिर निर्माण पर मैं इस चेतावनी मिल , या इस तरह ओवरराइड जोड़ें:

public override Task<int> SaveChangesAsync() 
{ 
    return base.SaveChangesAsync(); 
} 

हालांकि, जब तक आप SaveChangesAsync में कुछ और करने के लिए है तो यह व्यर्थ है (और Resharper इसे आपके लिए बाहर निकाल देता है)।

+0

आपके विस्तृत उत्तर के लिए धन्यवाद! दुर्भाग्यवश, 'वापसी आधार। सेव चेंजएसिंक();' बिल्ड को असफल होने का कारण बनता है .वेव चेंजएसिंक() को हल नहीं किया जा सकता है। –

+0

मैं इसे पुन: पेश नहीं कर सकता। क्या यह आपके 'ApplicationDbContext' या' TestContext' में है? –

+0

इस मामले में 'ApplicationDbContext' –

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