Excel 2007: AccUnit Testumgebung entfernen

Testen von Access-Anwendungen

Excel 2007: AccUnit Testumgebung entfernen

Beitragvon Sten Schmidt » Fr 4. Mai 2012, 15:26

Hallo Zusammen,

ich habe eine xlsm-Datei mit AccUnit-Tests. Wenn ich über das Menü "Testumgebung entfernen" aufrufe, dann passiert (außer dass das Export-Verzeichnis erzeugt wird) nix.

Kann das jemand bestätigen?
Oder mache ich was falsch?

Viele Grüße
Sten Schmidt
Entwickler
 
Beiträge: 146
Registriert: Do 18. Mär 2010, 22:24
Accessversion: 2016
Access-Erfahrung: Experte

Re: Excel 2007: AccUnit Testumgebung entfernen

Beitragvon Josef Pötzl » Fr 4. Mai 2012, 15:54

Hallo!

Mit Excel 2010 getestet: Unit-Tests und AccUnit-Verweise werden entfernt.

mfg
Josef
Josef Pötzl
Moderator
 
Beiträge: 805
Registriert: Mo 30. Nov 2009, 10:08
Wohnort: Klagenfurt
Accessversion: 2016

Re: Excel 2007: AccUnit Testumgebung entfernen

Beitragvon Sten Schmidt » Fr 4. Mai 2012, 16:01

Hi Josef,

danke für das Feedback. Werd mal versuchen mit dem Visual Studio ne Debug-Sitzung hinzubekommen... Du weißt nicht zufällig was man da im Projekt einstellen muss? :)
Sten Schmidt
Entwickler
 
Beiträge: 146
Registriert: Do 18. Mär 2010, 22:24
Accessversion: 2016
Access-Erfahrung: Experte

Re: Excel 2007: AccUnit Testumgebung entfernen

Beitragvon Josef Pötzl » Fr 4. Mai 2012, 16:12

Hallo!

Vorgehensweise:
1. Excel + VBA-Editor starten.
2. Im AccUnit-Projekt einen Haltepunkt in AccessCodeLib.AccUnit.AddIn.VbeIntegrationManager.RemoveTestEnvironment setzen
3. An Excel-Prozess anhängen: VS-Menü: Debug - Attach to Process ... Excel.exe auswählen
4. Im AccUnit-Menü des Excel-VBA-Editors "Remove environment" klicken

mfg
Josef
Josef Pötzl
Moderator
 
Beiträge: 805
Registriert: Mo 30. Nov 2009, 10:08
Wohnort: Klagenfurt
Accessversion: 2016

Re: Excel 2007: AccUnit Testumgebung entfernen

Beitragvon Sten Schmidt » Fr 4. Mai 2012, 16:42

Hi Josef,

ahh cool, funktioniert. Anbei:

In TestClassManager.cs in Zeile 85 bei

Code: Alles auswählen

        public void RemoveTestComponents(IEnumerable<CodeModuleInfo> list, bool export = true)
        {
            var exportDirectory = (export ? ExportDirectory : null);
            foreach (var c in list) //<<== **1**
            {
                if (c.ComponentType == vbext_ComponentType.vbext_ct_Document)
                    RemoveOfficeDocument(c.Name, export, exportDirectory);
                else
                    RemoveVbComponent(c.Name, export, exportDirectory);
            }
            DeleteFactoryCodeModule();
        }
 


Bei der ersten Zuweisung von c bei //<<== **1** springt der Debugger nach VBEAdapter.cs Zeile 84

Code: Alles auswählen

        private int NewWndProc(IntPtr hWnd, int wMsg, int wParam, int lParam)
        {
            try
            {
                switch ((WmMessage)wMsg)
                {
                    case WmMessage.Parentnotify:
                        if (wParam == (int)WmMessage.RButtondown && MainWindowRButtonDown != null)
                            MainWindowRButtonDown(this, null);
                        break;
                    case WmMessage.Hotkey:
                        CheckHotKeys(wParam);
                        break;
                }
            }
            catch (Exception ex)
            {
                Logger.Log(ex);
            }

            try
            {
                return CallWindowProc(_oldWndProc, hWnd, wMsg, wParam, lParam); //<<== **2**
            }
            catch (Exception ex)
            {
                Logger.Log(ex);
                return 0;
            }
        }
 


und gibt bei //<<== **2** auch einen Return zurück. Danach ist jedoch schluss (gelber Debug-Pfeil im Studio is weg).
Je nachdem wie viel zeit man sich lässt, springt er auch //<<== **2** mehrfach an, danach ist jedoch immer schluss...

Schöne Schei*e. :(
Sten Schmidt
Entwickler
 
Beiträge: 146
Registriert: Do 18. Mär 2010, 22:24
Accessversion: 2016
Access-Erfahrung: Experte

Re: Excel 2007: AccUnit Testumgebung entfernen

Beitragvon Josef Pötzl » Fr 4. Mai 2012, 16:57

Hallo!

Ich erkenne den Zusammenhang von RemoveTestComponents mit NewWndProc nicht.

Kommst du nicht bis RemoveVbComponent?

mfg
Josef
Josef Pötzl
Moderator
 
Beiträge: 805
Registriert: Mo 30. Nov 2009, 10:08
Wohnort: Klagenfurt
Accessversion: 2016

Re: Excel 2007: AccUnit Testumgebung entfernen

Beitragvon Sten Schmidt » Fr 4. Mai 2012, 17:30

Hi,

jetzt hab ich was:

Code: Alles auswählen
wParam: 0
lParam: 0
nResult: 0
nResult: 0
Eine Ausnahme (erste Chance) des Typs "System.Reflection.TargetInvocationException" ist in mscorlib.dll aufgetreten.
 1.651.568,0ms: OfficeApplicationHelper.GetCheckedVbProject                 : Ein Aufrufziel hat einen Ausnahmefehler verursacht.
   bei System.RuntimeType.InvokeDispMethod(String name, BindingFlags invokeAttr, Object target, Object[] args, Boolean[] byrefModifiers, Int32 culture, String[] namedParameters)
   bei System.RuntimeType.InvokeMember(String name, BindingFlags bindingFlags, Binder binder, Object target, Object[] providedArgs, ParameterModifier[] modifiers, CultureInfo culture, String[] namedParams)
   bei System.Type.InvokeMember(String name, BindingFlags invokeAttr, Binder binder, Object target, Object[] args)
   bei AccessCodeLib.Common.VBIDETools.InvocationHelper.InvokeMember(String name, BindingFlags bindingFlags, Object[] args)
   bei AccessCodeLib.Common.VBIDETools.InvocationHelper.InvokeMethod(String methodName, Object[] args)
   bei AccessCodeLib.Common.VBIDETools.OfficeApplicationHelper.GetDocumentFullName()
   bei AccessCodeLib.Common.VBIDETools.OfficeApplicationHelper.GetCheckedVbProject()
         0,0ms: TestClassReader.GetTestComponents                           : Block entry
         0,0ms: TestClassReader.GetTestComponents                           : Block exit
 


Nein, bis RemoveVbComponent komm ich gar nicht.
Sten Schmidt
Entwickler
 
Beiträge: 146
Registriert: Do 18. Mär 2010, 22:24
Accessversion: 2016
Access-Erfahrung: Experte

Re: Excel 2007: AccUnit Testumgebung entfernen

Beitragvon Sten Schmidt » Fr 4. Mai 2012, 18:23

Also ich hab es jetzt zurückverfolgt bis InvocationHelper.cs:

Code: Alles auswählen

        private object InvokeMember(string name, BindingFlags bindingFlags, object[] args)
        {
            Debug.WriteLine("We are in InvocationHelper -> InvokeMember");
            Debug.WriteLine("name: " + name);
            //Debug.WriteLine("bindingFlags: " + bindingFlags.ToString());
            //Debug.WriteLine("args: " + args.ToString());

            try
            {
                return _type.InvokeMember(name, bindingFlags, null, _target, args);
            }
            catch (Exception e)
            {
                Debug.WriteLine(e.ToString());
                return null;
            }
        }
 


Die Ausgabe ergibt:

Code: Alles auswählen

We are in InvocationHelper -> InvokeMember
name: VBE
"EXCEL.EXE" (Verwaltet (v2.0.50727)): "C:\Windows\assembly\GAC_MSIL\Microsoft.VisualStudio.Debugger.Runtime\10.0.0.0__b03f5f7f11d50a3a\Microsoft.VisualStudio.Debugger.Runtime.dll" geladen
We are in InvocationHelper -> InvokeMember
name: ActiveWorkbook
Eine Ausnahme (erste Chance) des Typs "System.Reflection.TargetInvocationException" ist in mscorlib.dll aufgetreten.
System.Reflection.TargetInvocationException: Ein Aufrufziel hat einen Ausnahmefehler verursacht. ---> System.Runtime.InteropServices.COMException (0x80020003): Mitglied nicht gefunden. (Ausnahme von HRESULT: 0x80020003 (DISP_E_MEMBERNOTFOUND))
   --- Ende der internen Ausnahmestapelüberwachung ---
   bei System.RuntimeType.InvokeDispMethod(String name, BindingFlags invokeAttr, Object target, Object[] args, Boolean[] byrefModifiers, Int32 culture, String[] namedParameters)
   bei System.RuntimeType.InvokeMember(String name, BindingFlags bindingFlags, Binder binder, Object target, Object[] providedArgs, ParameterModifier[] modifiers, CultureInfo culture, String[] namedParams)
   bei System.Type.InvokeMember(String name, BindingFlags invokeAttr, Binder binder, Object target, Object[] args)
   bei AccessCodeLib.Common.VBIDETools.InvocationHelper.InvokeMember(String name, BindingFlags bindingFlags, Object[] args)

 


Die Stelle wird mehrfach aufgerufen, also mit "VBE" und "ActiveWorkBook".
Habe hierbei schon versucht "ActiveWorkBook" in "ActiveWorkbook" umzubenennen, aber das scheint es auch nicht zu sein.
Sten Schmidt
Entwickler
 
Beiträge: 146
Registriert: Do 18. Mär 2010, 22:24
Accessversion: 2016
Access-Erfahrung: Experte

Re: Excel 2007: AccUnit Testumgebung entfernen

Beitragvon Sten Schmidt » Fr 4. Mai 2012, 21:08

Lösung

Leider liegt es an meiner xlsm-Datei, diese scheint offenbar defekt zu sein.
Bei einer frisch erstellten Excel-Datei funktioniert das Entfernen der Testumgebung.

Update

Die Datei hatte in einigen Sheets einen Blattschutz (kein VBA Projekt-Kennwort), nach dem Entfernen funktioniert es.
Warum auch immer... nachstellen lässt es sich mit der frisch erstellten Datei nicht.
Sten Schmidt
Entwickler
 
Beiträge: 146
Registriert: Do 18. Mär 2010, 22:24
Accessversion: 2016
Access-Erfahrung: Experte


Zurück zu AccUnit

cron