Laden...

Mocking Framework für Typescript / Javascript

Erstellt von Wax vor 7 Jahren Letzter Beitrag vor 7 Jahren 1.895 Views
Wax Themenstarter:in
731 Beiträge seit 2006
vor 7 Jahren
Mocking Framework für Typescript / Javascript

Guten Abend,

hat vielleicht jemand hier Erfahrung mit einem Mocking Framework für JavaScript/Typescript und kann dieses empfehlen?

Ich habe mir TypeMoq und JsMockito + TypeScript Definition angeschaut und beide Frameworks haben mich nur verwirrt.

Ich bin es gewohnt, dass ich ein Mock-Objekt z.B. so definiere:


var mock = new Mock<Interface>();
mock.Setup(obj => obj.Name).Returns("Hans");

In den JavaScript/Typescript Frameworks muss man dem "Mock<>" Konstruktor eine Instanz oder eine Funktion übergeben, von der dann das Mock-Objekt erstellt wird.
Wenn ich aber bereits eine Instanz einer konkreten Klasse hätte, dann bräuchte ich kein Mock mehr.

Ihr seht, die Tools verwirren mich mehr als das sie mir zur Zeit helfen.

Vielleicht habt ihr ja bereits Erfahrungen in dem Bereich sammeln können und könnt mir ein Tool empfehlen.

Gruß
wax

16.842 Beiträge seit 2008
vor 7 Jahren

Nö.
Mit TypeScript und TypeMoq wird die Klasse übergeben.
Syntax sieht halt ein bisschen anders aus, weil eben nicht C#.

var mock: TypeMoq.Mock<Bar> = typemoq.Mock.ofType(Bar);

Bei einer Instanz wäre es


var bar = new Bar();
var mock: TypeMoq.Mock<Bar> = typemoq.Mock.ofInstance(bar);

Ich glaub Dich verwirrt das nur, weil Du der Sprache noch nicht ganz mächtig bist 😉

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

Ich glaub Dich verwirrt das nur, weil Du der Sprache noch nicht ganz mächtig bist 😉

Das mag durchaus sein. 😉

Ich hätte halt gerne das geschrieben


var engineMock: TypeMoq.Mock<Model.IEngine> = typemoq.Mock.ofType(Model.IEngine);

und nicht das


var engineMock: TypeMoq.Mock<Model.IEngine> = typemoq.Mock.ofType(Model.TurboEngine);

Einfach weil ich keinen Bezug zu ner konkreten Implementierung haben möchte.

Gruß
wax

16.842 Beiträge seit 2008
vor 7 Jahren

Dann erweiter Typemoq um die Funktionalität und stell einen Push Request.
Deswegen ist es Open Source.

Ich kenn aber wenig TypeScript Code, die überhaupt Klassen verwenden.
Die meisten nutzen nur Interfaces.
Liegt einfach daran, dass TypeScript auch nicht C# ist und daraus auch später JavaScript wird.

Da musste - um was richtig vergleichbares zu haben - einfach noch Jahre warten, bis es dann Web Assemblies gibt.
Oder zumindest bis EcmaScript 8.

742 Beiträge seit 2005
vor 7 Jahren

Ich benutze nur Klassen und kaum Interfaces 😉

Das Problem ist, dass Interfaces nur ein Typescript Konzept sind um Typsicherheit zu verbessern. Im erzeugten Javascript existieren die aber nicht mehr. Wenn du also Typemoq nur ein Interface übergeben würdest, hätte es keine Informationen mehr über die zu mockenden Funktionen.

Deshalb kann man in Angular2 auch Interfaces nicht direkt im Service Container über provide registrieren und darüber Abhängigkeiten auflösen.

Allerdings braucht man Interfaces auch weniger. Du kannst nämlich eine Klasse als Mockup verwenden. TypeMoq tauscht dann einfach die Methoden aus. Das geht sehr leicht, es sei denn du hast einen komplexen Constructor mit Dependencies. Dann müsstest du TypeMoq alle Parameter übergeben. Was du dann zum Beispiel machen kannst ist:


class Foo { }

class Bar implements Foo {}

Damit kannst du dir eine neue Klasse erstellen, die nichts macht, die du aber dann Typemoq übergeben kannst. wenn du es brauchst.