示例#1
0
        //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);
        }