Laden...

Globale Mocks mit TypeMoq und Mocha synchronisieren

Erstellt von Wax vor 7 Jahren Letzter Beitrag vor 7 Jahren 1.809 Views
Wax Themenstarter:in
731 Beiträge seit 2006
vor 7 Jahren
Globale Mocks mit TypeMoq und Mocha synchronisieren

Hallo zusammen,

hat vielleicht jemand Erfahrung mit globalen Mocks unter TypeMoq?
Ich möchte den Zugriff auf


window["MyGlobal"]

gerne mittels TypeMoq mocken.

Dazu verwende ich ein Interface von MyGlobal.


let globalMock = TypeMoq.GlobalMock.ofType2<IMyGlobal>('MyGlobal', window);

Das funktioniert soweit auch ganz gut, allerdings bekomme ich mit mocha race conditions, da sich mehrere Tests wohl parallel das globale Objekt "kaputt" schreiben.

Nun habe ich auf der Doku-Seite von TypeMoq etwas von GlobalMock + GlobalScope gesehen und getestet, bekomme dieses "Sandbox" verhalten allerdings nicht hin. Wenn ich z.B. am Ende des Tests verifiziere, wie oft eine bestimmte Methode des Mocks aufgerufen wurde, dann sehe ich, dass alle Aufrufe addiert wurden und nicht in eigenen Scopes stattfanden.

Falls hier jemand Erfahrung hat, wie man am besten damit umgeht, wenn Tests sich mit globalen Objekten in die Haare kriegen, dann möge er dies bitte mitteilen. 😉

Gruß
wax

D
985 Beiträge seit 2014
vor 7 Jahren

Erkläre mir doch mal wozu diese globalen Mocks benötigt werden.

Bei Unit-Tests gibt es eigentlich nichts Globales was man in die Tests mit hineinnimmt. Benötige ich den gleichen Mock in mehreren Tests, dann wird dieser Mock über eine Factory erstellt und jeder Test bekommt eine eigene Instanz.

Wax Themenstarter:in
731 Beiträge seit 2006
vor 7 Jahren

Es ist nur so das ich nicht steuern kann wann welcher Test ausgeführt wird und die einzelnen SUTs verwenden Zugriffe auf window["MyGlobal"]. Ich möchte gerne erreichen das jeder Test seine eigene globale Umgebung erhält. Leider kriege ich das unter TypeMoq nicht hin. Deswegen die Frage

16.827 Beiträge seit 2008
vor 7 Jahren

Aber warum brauchst Du eine globale Variable oder einen globalen Mock, was hast Du denn vor?
Ich bin kein JavaScript/TypeScript Guru aber kümmere mich auch im unser Frontend-Team und ich hab bisher nich gesehen, dass irgendwas Global is - das wäre mir aufgefallen 😉
Bei "Global" bimmelt es eigentlich direkt, dass man mal nachhaken sollte, warum das notwendig ist.

D
985 Beiträge seit 2014
vor 7 Jahren

Dein Testszenario sieht also so aus, dass über eine IMyGlobal Instanz auf etwas zugegriffen wird.

Dann gib dem Test doch eine eigene IMyGlobal Instanz. Dann hast du keine race condition und du kannst auch ganz gezielt testen.

Wax Themenstarter:in
731 Beiträge seit 2006
vor 7 Jahren

Genau so ist es dann auch geschehen. Danke für die Hinweise. Mich hätte halt interessiert wie das andere Vorgehen funktioniert. 😉

Mit freundlichen Grüßen
wax