2009-07-14 1 views
5

Angenommen, ich habe eine Methode, die einige Argumente benötigt und sie als Instanzvariablen speichert. Wenn einer von ihnen null ist, wird später ein Code abstürzen. Würden Sie die Methode ändern, um eine Ausnahme auszulösen, wenn Nullargumente bereitgestellt werden, und Unit-Tests hinzufügen, um dies zu überprüfen oder nicht? Wenn ich das tue, ist es etwas komplizierter, da Javascript viele schlechte Werte hat (null, undefined, NaN, usw.) und da es dynamische Typisierung hat, kann ich nicht einmal überprüfen, ob die richtige Art von Objekt übergeben wurde.Wie wichtig ist es, beim Testen von Einheiten nach schlechten Parametern zu suchen?

Antwort

7

Ich denke, es hängt wirklich davon ab, welche API Sie testen. Wenn es sich um eine Komponente handelt, die nur für den internen Gebrauch entworfen und gebaut wurde und Sie wissen, dass die Verwendung bestimmten Einschränkungen unterliegt, kann es zu einem Overkill für den Komponententest für fehlerhafte Parameter kommen. Auf der anderen Seite, wenn Sie über etwas sprechen, das extern verteilt werden soll, oder das in einer Vielzahl von Situationen verwendet wird, von denen einige schwer vorherzusagen sind, dann ist das Überprüfen auf schlechte Parameter angemessen. Es hängt alles von der Nutzung ab.

7

Ich denke, Sie haben wirklich 2 verschiedene Fragen hier.

Die erste ist, was ist die beste Praxis für die Validierung der Parametereingabe und die zweite ist, sollte Ihr Gerät Test Test für diese Situationen zu behandeln.

Ich würde empfehlen, dass Sie entweder eine Argumentausnahme für den Parameter werfen, der nicht korrekt an Ihre Funktion geliefert wurde, oder eine andere Variable/Nachricht, die die aufrufende Funktion/den Benutzer über die Situation informiert. Normalerweise möchten Sie keine Ausnahmen auslösen und sollten verhindern, dass die Funktionen überhaupt aufgerufen werden, wenn Sie wissen, dass sie fehlschlagen.

Für Ihren Komponententest sollten Sie unbedingt NULL-Wert-Tests einschließen, um sicherzustellen, dass ein gefälliges Ergebnis auftritt.

+1

Ich stimme dem zu. Parametertests sollten in den Funktionen/Methoden * selbst durchgeführt werden * wo immer geeignet (d. H. Fast die ganze Zeit). – Noldorin

1

JavaScript hat Instanceof und typeof, die helfen können Sie überprüfen, welche Art von Objekten auf Ihre Funktionen übergeben werden:

'undefined' == typeof noVariable; // true 
var noVariable = null; 
'undefined' == typeof noVariable; // false 
typeof noVariable; // 'object' 
noVariable === null; // true 

var myArray = []; 
typeof myArray; // 'object' 
myArray instanceof Object; // true 
myArray instanceof Array; // true 

var myObject = {}; 
typeof myObject; // 'object' 
myObject instanceof Object; // true 
myObject instanceof Array; // false 

Sie können diese verwenden, um einige default „schlechten“ Werte zu setzen für Ihre Instanzvariablen:

function myFunction(foo,bar) { 
    foo = foo instanceof Array ? foo : []; // If 'foo' is not an array, make it an empty one 
    bar = bar instanceof Number ? bar : 0; 

    // This loop should always exit without error, although it may never do a single iteration 
    for (var i=0; i<foo.length; i++) { 
     console.log(foo[i]); 
    } 

    // Should never fail 
    bar++; 
} 

Der oder Betreiber auch sehr nützlich ist:

function myFunction(blat) { 
    var blat = blat||null; // If 'blat' is 0, '', undefined, NaN, or null, force it to be null 

    // You can be sure that 'blat' will be at least *some* kind of object inside this block 
    if (null!==blat) { 
    } 
} 
+1

foo wird gleich wahr, wenn es ein Array ist? –

+0

Whoopsie. Ja, das 'foo/bar'-Beispiel ist geburkst. Für diejenigen, die dies als Antwort betrachten, ersetzen Sie die Operatoren ** oder ** '||' durch einen ternären Ausdruck: '(foo instanceof Array)? foo: [] '. – shuckster

0

Vergessen Sie auch nicht, dass Sie mit JavaScript weniger als oder mehr als die erwartete Anzahl von Parametern übergeben können. Sie können das auch überprüfen, wenn Sie möchten.

0

Für die Erstellung von robusten und sicheren Code ist die Überprüfung der Edge Cases definitiv eine wichtige Aufgabe. Positive und negative Tests sind immer gut für die Qualität. Das Fehlen von negativen Tests könnte Sie auf lange Sicht beißen.

Also würde ich sagen, es ist besser, auf Nummer sicher zu gehen - beides. Es ist ein bisschen mehr Arbeit, aber wenn Sie sich die Zeit leisten können, dann wird es sich lohnen. Es kann manchmal sehr interessant sein, den Entwicklerhut abzulegen und den Cracker-Hut anzuziehen.

Verwandte Themen