public void ActionWorkerAllOnUITypeTesting() { using (ShimsContext.Create()) { Session session = new Microsoft.Deployment.WindowsInstaller.Fakes.ShimSession().Instance; Microsoft.Deployment.WindowsInstaller.Fakes.ShimSession.AllInstances.GetModeInstallRunMode = (@this, mode) => { return mode == InstallRunMode.Scheduled; }; // Установим по умолчанию сессию, иначе будут вызываться с других тестом Stub-объекты. // Не понятно почему, разобрать позже... session.SetDefaultSessionService(null); var workers = new[] { new { Worker = (IActionWorker)new StubActionCheckConnectionWorker(session), ServerMode = true, ClientMode = false }, new { Worker = (IActionWorker)new StubActionDatabaseUIControlWorker(session), ServerMode = true, ClientMode = false }, new { Worker = (IActionWorker)new StubActionDefineSqlServerPathWorker(session), ServerMode = true, ClientMode = false }, new { Worker = (IActionWorker)new StubActionInstallingExtendedProceduresWorker(session), ServerMode = true, ClientMode = false }, new { Worker = (IActionWorker)new StubActionMefControlWorker(session), ServerMode = true, ClientMode = true }, new { Worker = (IActionWorker)new StubActionRestoringDatabaseWorker(session), ServerMode = true, ClientMode = false }, new { Worker = (IActionWorker)new StubActionRunSqlScriptNewDbWorker(session), ServerMode = true, ClientMode = false }, new { Worker = (IActionWorker)new StubActionRunSqlScriptExistingDbWorker(session), ServerMode = true, ClientMode = false }, new { Worker = (IActionWorker)new StubActionSelectDatabasesWorker(session), ServerMode = true, ClientMode = false }, new { Worker = (IActionWorker)new StubActionServerUIControlWorker(session), ServerMode = true, ClientMode = false }, new { Worker = (IActionWorker)new StubActionTempDirectoryControlWorker(session), ServerMode = true, ClientMode = true }, new { Worker = (IActionWorker)new StubActionUITypeWorker(session), ServerMode = true, ClientMode = true }, new { Worker = (IActionWorker)new StubActionInitializationFinishInfoWorker(session), ServerMode = true, ClientMode = false }, new { Worker = (IActionWorker)new StubActionWidgetCreaterWorker(session), ServerMode = true, ClientMode = false }, new { Worker = (IActionWorker)new StubActionInstallReportWorker(session), ServerMode = true, ClientMode = true } }; // Берем все не абстрактные типы с реализацией IActionWorker и проверяем количество в тестируемом списке. var workerTypes = typeof(IActionWorker).Assembly.GetTypes(). Where(v => !v.IsAbstract && v.GetInterface(typeof(IActionWorker).Name) != null).ToArray(); Assert.AreEqual(workerTypes.Count(), workers.Length, string.Format("Не все тесты IActionWorker реализованы ({0} из {1}).", workers.Length, workerTypes.Count())); foreach (var type in workerTypes) { Assert.IsNotNull(workers.FirstOrDefault(v => v.Worker.GetType().IsSubclassOf(type)), string.Format("Нет реализации для {0}.", type.Name)); } // Проверяем функциональность. foreach (var worker in workers) Check(worker.Worker, worker.ServerMode, worker.ClientMode); } }
public void WixListViewTesting() { using (ShimsContext.Create()) { List<Record> list = new List<Record>(); // Используется для хранения добавленных и удаленных объетков. Microsoft.Deployment.WindowsInstaller.Fakes.ShimSession.AllInstances.DatabaseGet = delegate { return new Microsoft.Deployment.WindowsInstaller.Fakes.ShimDatabase().Instance; }; Microsoft.Deployment.WindowsInstaller.Fakes.ShimDatabase.AllInstances.OpenViewStringObjectArray = (@this, sqlFormat, args) => { // Логика удаления реализована здесь. if (sqlFormat.StartsWith("DELETE") && sqlFormat.Contains("Value")) { Record r = list.FirstOrDefault(v => v.GetString(3) == args[1].ToString()); list.Remove(r); } // Логика очистки. if (sqlFormat.StartsWith("DELETE") && !sqlFormat.Contains("Value")) { list.Clear(); } return new Microsoft.Deployment.WindowsInstaller.Fakes.ShimView().Instance; }; Microsoft.Deployment.WindowsInstaller.Fakes.ShimDatabase.AllInstances.CreateRecordInt32 = (@this, fieldCount) => { return new Record(fieldCount); }; int index = -1; // Для View.Fetch(). Microsoft.Deployment.WindowsInstaller.Fakes.ShimView.AllInstances.Fetch = (@this) => { // Сюда заходим при получении списка объектов (Items) и при получении максимального номера вставки. // Если в списке есть элементы, то передать их. if (++index < list.Count) return list[index]; else { index = -1; return null; } }; Microsoft.Deployment.WindowsInstaller.Fakes.ShimView.AllInstances.ModifyViewModifyModeRecord = (@this, mode, record) => { list.Add(record); }; // Логика добавления реализована здесь. Microsoft.Deployment.WindowsInstaller.Fakes.ShimInstallerHandle.AllInstances.Dispose = delegate { }; // Чтобы не освобождался Record. // Начало теста. Session session = new Microsoft.Deployment.WindowsInstaller.Fakes.ShimSession().Instance; WixListView view = new WixListView(session, "viewProperty"); Assert.AreEqual(0, list.Count); // Дополнительная проверка. Check(list, view.Items); view.AddItem(new WixListItem("Text1", "Value1", "Icon1")); Assert.AreEqual(1, list.Count); // Дополнительная проверка. Check(list, view.Items); view.AddItems(new WixListItem[] { new WixListItem("Text2", "Value2", "Icon2"), new WixListItem("Text3", "Value3", "Icon3") }); Assert.AreEqual(3, list.Count); // Дополнительная проверка. Check(list, view.Items); // Удаление. view.RemoveItem("Value2"); Assert.AreEqual(2, list.Count); // Дополнительная проверка. Check(list, view.Items); // Очистка. view.ClearItems(); Assert.AreEqual(0, list.Count); // Дополнительная проверка. Check(list, view.Items); } }