Thanks Jeff. What DAL library do you use that has good testability? Everything about MS ORM is great except for the testabiliti-ness.
Do you know how i could go about solving this problem, or who to ask about it? Happy holidays, Vijay On Dec 30, 8:25 pm, "Jeff Brown" <[EMAIL PROTECTED]> wrote: > I think what's happening is that there are two different transaction > contexts in play -- one for each thread. > > The main thread of the test runs in one transaction context provided by the > [Rollback] attribute and the background thread is probably getting its own > transaction context. Because the first transaction has not been committed > yet (thanks to [Rollback] the second transaction cannot see the changes that > were made. > > Just a guess. > > If this is indeed the case, then you'd need to ensure that the operations > performed by the ScheduleTimer thread get enlisted in the transaction > context of the main test thread somehow. I'm afraid I don't know how to > help you with that off-hand since I've not worked with the MS ORM stuff > myself. > > Happy holidays, > Jeff. > > -----Original Message----- > From: [email protected] [mailto:[EMAIL PROTECTED] On > > Behalf Of CVertex > Sent: Saturday, December 29, 2007 11:35 PM > To: MbUnit.User > Subject: MbUnit Rollback Threaded Issues > > Hi Guys, > > I'm a new TDD'er and I'm already witnessing significant increases in bug > findings in my own code. I can't understand how I built software in the past > without MbUnit and Rhino Mocks. I support webforms was a big set back, but > now that MS MVC is in the works, i'm building more reliable sites already. > > The idea of creating mock harnesses, environments and relationships is kinda > addictive for exploring the limits of function. But, when I can't think of a > good way to test my DAL. Now 3.5 is out, I've jumped onto LINQ-to-SQL ORM > cos it's so well implemented, but unit testing it isn't very easy. For those > that have jumped onto MS ORM, is there a general pattern I can follow to > unit test my DAL? > > Since I can't mock or fake my DAL, I'm writing to the database in each test > and relying on RollbackAttribute to erase the changes. This works great for > simple single threaded tests, but I'm having issues accessing database > changes in a thread separate to the [Test] method. > > I'm trying to test a simple scheduling system. The code for the class > is: > > public class ReminderManager { > public const string ReminderManagerKey = "ReminderManager"; > > private ScheduleTimer timer = new ScheduleTimer(); > public ScheduleTimer Timer { get { return timer; } } > > private DateTime lastCheckTime = DateTime.Now; > public DateTime LastCheckTime { get { return lastCheckTime; } } > > public event Schedule.ExceptionEventHandler CheckError > { > add > { > timer.Error += value; > } > > remove > { > timer.Error -= value; > } > } > > public void SetUpTimer(IScheduledItem schedule) { > timer.AddJob(schedule, new Action(CheckForReminders)); > timer.Start(); > } > public void TearDownTimer() { > timer.Stop(); > } > > protected virtual void CheckForReminders() { > > DateTime now = DateTime.Now; > > // check for reminders between now and last event > CharlesNicholasDataContext db = new > CharlesNicholasDataContext(); > var reminders = from r in db.Reminders where > r.DateTime>lastCheckTime && r.DateTime<=now > select r; > > int numrems = db.Reminders.Count(); > foreach (var reminder in reminders) { > Launch(reminder); > } > > // update last checked > lastCheckTime = now; > } > > protected virtual void Launch(Reminder reminder) > { > string message = "{3} Should send SMS to {0} on number {1}"; > Console.WriteLine(message, reminder.Client.FirstName, > reminder.Client.MobileNumber,reminder.DateTime.ToShortTimeString()); > } > > } > > My First test checks that CheckReminders is called periodically. I use the > Test specific subclass pattern to override CheckReminder for the following > test: > [Test] > [Duration(4000d)] > public void EnsurePeriodicReminderChecking() > { > var rmtest = new ReminderManagerTest(); > rmtest.SetUpTimer(HalfSecondSchedule()); > System.Threading.Thread.Sleep(750); > Assert.IsTrue(rmtest.NumberOfChecks == 2); // 2 includes start > of timing AND first tick > rmtest.TearDownTimer(); > } > > The second test is causing me grief - it needs to test that reminders of the > specific criteria are actually discovered and launched. > [Test] > [RollBack] > [Duration(4000d)] > public void LaunchSms() { > // add fake but valid db data > var client = FakeClient(); > db.Clients.InsertOnSubmit(client); > db.SubmitChanges(); > > var message = FakeMessage(); > db.ReminderMessages.InsertOnSubmit(message); > db.SubmitChanges(); > > var rem = FakeReminder(); > rem.ReminderMessageId = message.Id; > rem.ClientId = client.Id; > db.Reminders.InsertOnSubmit(rem); > db.SubmitChanges(); > > // run once off timer > manager.SetUpTimer(OnceOff()); > int numres = db.Reminders.Count(); > System.Threading.Thread.Sleep(20000); > > // TODO check sms message is launched > // TODO check send sms return code is given > > } > > So, in the test thread, I create a fake reminder, message and client and > submit to the database. Then in the ReminderManager > CheckReminders() it needs to read those fake records and should find the > fake records. > > In the [Test] method, the numRes integer is 2, but in the > CheckReminders() method, numRes is 1. It's like the db changes in the first > thread aren't visible from the second, even though no exception is thrown. > > Is there an obvious explanation for that? Will the removal of Rollback make > the database changes visible from the ReminderManager ScheduleTimer thread? > > This is a bit mind boggling. > > Thanks for your help, > -Vijay --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "MbUnit.User" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/MbUnitUser?hl=en -~----------~----~----~----~------~----~------~--~---
