फेंकता है मैं एक परियोजना के लिए स्वचालित परीक्षण लिख रहा हूं जिसे मैं एमवीसी, एंटिटीफ्रेमवर्क (कोड पहले), यूनिट परीक्षण और मोक से अधिक परिचित होने के लिए काम कर रहा हूं।स्वचालित परीक्षणों में DbContext.ChangeTracker SQLException
public void RepoSaveChanges()
{
foreach(var entry in _dbContext.ChangeTracker.Entities().Where(e => e.State == EntityState.Modified))
{
MyModelBase model = entry.Entity as MyModelBase;
if (model != null)
{
model.LastModified = DateTime.Now;
}
}
_dbContext.SaveChanges();
}
इस दौरान ठीक काम करता है:
मैं अपने Repository
कक्षा में एक खंड जो मेरे मॉडल का एक LastModified
फ़ील्ड सेट करता है जब भी Repository.SaveChanges()
नियंत्रक है कि इस तरह काम करता है (MyModelBase एक आधार वर्ग है) द्वारा कहा जाता है सामान्य ऑनलाइन वातावरण में एप्लिकेशन रन टाइम, लेकिन परीक्षण विधियों में चलते समय यह टूट जाता है। मैं डीबीसीएन्टेक्स्ट में डीबीसेट्स को नकल करने के लिए मोक का उपयोग करता हूं और अपना टेस्ट डेटा सेट करता हूं।
यहाँ मेरे लिए अजीब हिस्सा है: मेरे इकाई परीक्षण ठीक (पारित) चलाने पर वे कभी वास्तव में foreach
पाश में प्रवेश नहीं करते - यह लटका हुआ है जब ChangeTracker.Entities()
एक्सेस किया जाता है और पाश इस्तीफा, _dbContext.SaveChanges()
करने के लिए नीचे कूद। कोई त्रुटि नहीं है
हालांकि, एक दोस्त की मशीन पर जो मेरे साथ प्रोजेक्ट साझा करता है, उसे 0Qएक्सेस होने पर एक एसक्यूलेक्सप्शन मिलता है। मेरे पास VS2015 में फेंकने वाले एसक्यूएलएक्सप्सेप्शन हैं और मेरे पक्ष में अपवाद का कोई आउटपुट या अन्य संकेत नहीं है।
Result StackTrace:
at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection) ....Result Message:
Test method MyProject.Tests.TestClasses.MyControllerTests.TestCreate threw exception: System.Data.SqlClient.SqlException: A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: SQL Network Interfaces, error: 26 - Error Locating Server/Instance Specified)
अंत में, मेरे सवाल है: वहाँ Moq ChangeTracker (मैं पहले जांच से नहीं संदेह है) उपहास करने के लिए उपयोग करने के लिए एक रास्ता है, या वहाँ एक और दृष्टिकोण मैं अपने RepoSaveChanges()
कि स्वचालित रूप से एक संपत्ति सेट करने के लिए ले सकता है? ChangeTracker.Entities()
तक पहुँचने के बिना मैं हर मॉडल प्रकार यह है कि के लिए LastModified
क्षेत्र स्थापित करने के लिए अद्यतन तर्क है की आवश्यकता होगी। इसी तरह, मैं क्योंकि परीक्षण जिद्दी किया जा रहा है आदर्श नहीं है कि एपीआई/रूपरेखा का हिस्सा का उपयोग न की तरह लग रहा है।
किसी को क्यों SQLException फेंक नहीं है/मेरी मशीन पर पकड़ा नहीं किया जा सकता के रूप में किसी भी जानकारी है? या इकाई परीक्षणों में ChangeTracker.Entities()
का उपयोग करने के तरीके पर कोई सुझाव? मैं केवल एक अंतिम उपाय के रूप में मेरे सभी मॉडल और नियंत्रकों भर में अलग-अलग LastModified
गुण सेट होगा।
अद्यतन: अधिक नमूना कोड इतना अनुरोध किया गया है मुझे अधिक विस्तार में जाने दें। मैं moq का उपयोग कर एक DbContext नकली, तो DbSet वस्तुओं DbContext में निहित नकली:
var mockContext = new Mock<MyApplicationDbContext>(); //MyApplicationDbContext extends DbContext
Person p = new Person();
p.Name = "Bob";
p.Employer = "Superstore";
List<Person> list = new List<Person>();
list.Add(p);
var queryable = list.AsQueryable();
Mock<DbSet<Person>> mockPersonSet = new Mock<DbSet<Person>>();
mockPersonSet.As<IQueryable<Person>>().Setup(set => set.Provider).Returns(queryable.Provider);
mockPersonSet.As<IQueryable<Person>>().Setup(set => set.Expression).Returns(queryable.Expression);
mockPersonSet.As<IQueryable<Person>>().Setup(set => set.ElementType).Returns(queryable.ElementType);
mockPersonSet.As<IQueryable<Person>>().Setup(set => set.GetEnumerator()).Returns(() => queryable.GetEnumerator());
DbSet<Person> dbSet = mockPersonSet.Object as DbSet<Person>;
mockPersonSet.Setup(set => set.Local).Returns(dbSet.Local);
mockContext.Setup(context => context.Set<Person>()).Returns(mockPersonSet.Object);
mockContext.Setup(context => context.Persons).Returns(mockPersonSet.Object));
//Create the repo using the mock data context I created
PersonRepository repo = new PersonRepository(mockContext.Object);
//Then finally create the controller and perform the test
PersonController controller = new PersonController(repo);
var result = controller.Create(someEmployerID); //Sometimes throws an SQLException when DbContext.SaveChanges() is called
ईएफ का कौन सा संस्करण यह है? –
@ ई-बैट ईएफ संस्करण 6.1.3 – Softerware