//OK internal static void OnCodeClassSelection(AbstractTestFramework testFramework, CodeClass codeClass, DTE2 applicationObject, UnitTestCodeType codeType) { //We can only test public methods if (codeClass.Access != vsCMAccess.vsCMAccessPublic) { return; } Project parentProject = ProjectExaminar.GetCodeClassParentProject(codeClass); Project unitTestProject = ProjectExaminar.GetUnitTestProject(parentProject.Name, applicationObject, testFramework.TestProjectPostFix); if (unitTestProject != null && !CanGenerateHandleCodeClass(testFramework.TestClassFixturePostFix, codeClass, unitTestProject)) { UTGHelper.ErrorHandler.ShowMessage(CommonUserMessages.MSG_TEST_ALREADY_EXISTS); OnGenerationFaliure(applicationObject); return; } string path = ProjectManager.GetUnitTestProjectPath(parentProject.Name, applicationObject, testFramework.TestProjectPostFix); path = UTGHelper.IO.GetFilePath(path); System.IO.DirectoryInfo newDirectoryInfo; string fullPath = System.IO.Path.Combine(path, parentProject.Name + testFramework.TestProjectPostFix); try{ //Another way of doing this would be to try and find this project in current open solution saving us the exception newDirectoryInfo = System.IO.Directory.CreateDirectory(fullPath); } catch (Exception ex) { Logger.LogException(ex); } finally{ //Either case we have one by now so lets get its directory information newDirectoryInfo = new System.IO.DirectoryInfo(fullPath); } //If for whatever reason we are still failing then simply quit this if (newDirectoryInfo == null) { OnGenerationFaliure(applicationObject); throw new Exception(string.Format("Unable to create new Directory {0}", System.IO.Path.Combine(path, parentProject.Name + testFramework.TestProjectPostFix))); } if (unitTestProject == null) { try{ unitTestProject = ProjectManager.CreateAndAddUnitTestProject((Solution2)applicationObject.Solution, parentProject.Name + testFramework.TestProjectPostFix, newDirectoryInfo.FullName, codeType /*, license*/); } catch (Exception ex) { Logger.LogException(ex); OnGenerationFaliure(applicationObject); throw; } } //Rethink this bit //Since above operation fails in either case then try getting the new Unit Test Project if created and added ok.. if (unitTestProject == null) { unitTestProject = ProjectExaminar.GetUnitTestProject(parentProject.Name, applicationObject, testFramework.TestProjectPostFix); } if (unitTestProject == null) { OnGenerationFaliure(applicationObject); throw new Exception("Can not create new UnitTest Project"); } AbstractTestClassFactory testClassFactory = new NUnitTestClassFactory(); AbstractTestClass nunitClass = null; if (codeType == UnitTestCodeType.CSharp) { nunitClass = testClassFactory.CreateCSharpTestClass(codeClass.Namespace.FullName, codeClass.Name, codeClass.IsAbstract); } else if (codeType == UnitTestCodeType.VB) { nunitClass = testClassFactory.CreateVBTestClass(codeClass.Namespace.FullName, codeClass.Name, codeClass.IsAbstract); } if (!nunitClass.write(newDirectoryInfo.FullName, testFramework.TestClassFixturePostFix)) { OnGenerationFaliure(applicationObject); return; } //add new class to project ProjectItem projectItem = ProjectManager.AddClassToProject(applicationObject, unitTestProject, null, nunitClass.FullName); List <CodeClass> lstCodeClasses = ProjectItemExaminor.GetCodeClasses(projectItem.FileCodeModel); if (lstCodeClasses == null || lstCodeClasses.Count == 0) { OnGenerationFaliure(applicationObject); return; } CodeClass unitTestCodeClass = lstCodeClasses[0]; //passed this point the actual object will take care of it self. nunitClass.GenerateTest(unitTestCodeClass, codeClass); //To consider: this should be handled by an object that inherits from project type copyReferences(testFramework, parentProject, unitTestProject); applicationObject.ItemOperations.OpenFile(nunitClass.FullName, EnvDTE.Constants.vsViewKindAny); }