मैं अपने 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) के लिए त्रुटि भी हुई।
समस्या अब हल हो गई है, लेकिन केवल समाधान से संकुल को अनइंस्टॉल करने और पुनर्स्थापित करने, विजुअल स्टूडियो को पुनरारंभ करने और फिर परियोजना को पुनर्निर्माण करने के द्वारा। मैं अभी भी इस मुद्दे के सटीक कारण से अनिश्चित हूं।
मैंने जॉन के उत्तर को सही के रूप में चिह्नित किया है, क्योंकि यह सामान्य परिस्थितियों में होगा।
आपके विस्तृत उत्तर के लिए धन्यवाद! दुर्भाग्यवश, 'वापसी आधार। सेव चेंजएसिंक();' बिल्ड को असफल होने का कारण बनता है .वेव चेंजएसिंक() को हल नहीं किया जा सकता है। –
मैं इसे पुन: पेश नहीं कर सकता। क्या यह आपके 'ApplicationDbContext' या' TestContext' में है? –
इस मामले में 'ApplicationDbContext' –