2017-10-26 1 views
0

Ich versuche, die folgende FunktionTesting document.createElement ('a') mit Mokka/Chai/Sinon

export const checkForDuplicateUrl = (containers, url) => { 
    let a = document.createElement('a') 
    a.href = url 
    const urlHostName = a.hostname 

    return containers.find((container) => { 
    let b = document.createElement('a') 
    b.href = container.url 
    return urlHostName === b.hostname 
    }) 
} 

Diese Funktion nimmt in einer Reihe von containers und einer bestimmten URL zu testen. Sollte der Hostname der URL mit dem Hostnamen eines der einzelnen containers übereinstimmen, möchte ich diesen Container zurückgeben. Diese Methode funktioniert gut, aber ich bin mir nicht sicher, wie ich das testen soll oder auch, wenn ich sollte. Ich schrieb einen Test, der zunächst so ausgesehen:

describe('#checkForDuplicateUrl',() => {  
    const containers = [ 
     { id: 4, url: 'https://www.party.com'}, 
     { id: 5, url: 'elainebenes.com'} 
    ] 
    let url 
    describe('when there is a duplicate container and the passed in are the same',() => { 
     url = 'www.party.com' 
     it('returns the container',() => { 
     expect(checkForDuplicateUrl(containers, url).id).to.equal(4) 
     }) 
    }) 
    describe('when there is a duplicate container and the passed in are the same hostname but one lacks www',() => { 
     url = 'party.com' 
     it('returns the container',() => { 
     expect(checkForDuplicateUrl(containers, url).id).to.equal(4) 
     }) 
    }) 
    describe('when there is a duplicate container and the passed in are the same hostname but one has https',() => { 
     url = 'www.party.com' 
     it('returns the container',() => { 
     expect(checkForDuplicateUrl(containers, url).id).to.equal(4) 
     }) 
    }) 
    }) 

Das Problem ist, dass, wenn ich dies in meiner Testumgebung laufen, document.createElement('a') immer localhost haben wird, wie es Hostnamen, so dass es nicht wirklich wichtig, was Ich gebe an.

Wenn ich versuche, die document.createElement() mit sinon auszugeben, dann teste ich wirklich nichts, da ich den Hostnamen jedes Mal manuell zurückgeben muss.

Sollte ich diese Funktion auch testen? Wenn ja, wie sollte ich es testen?

Antwort

0

Das Problem hier bezog sich auf die Tatsache, dass url ich in die Funktion ging, wurde nicht mit http vorangestellt. Wenn Sie versuchen, ein href auf einem a-Tag ohne http festzulegen, erfasst das a-Tag einfach Ihren aktuellen Standort, der in diesem Fall http://localhost war.

wird dieser Test nach url = 'www.party.com'-url = 'http://www.party.com' passieren

Wechsel
0

Zunächst denke ich, dass Ihre Testfälle gut aussehen und ich denke, das ist definitiv etwas, das es zu testen lohnt. Es ist absolut in Ordnung (und in vielen Fällen empfohlen), externe Objekte/Funktionen für Komponententests auszugeben.

Was ich finde sehr verwirrend ist Ihre document.createElement() verwendet, um den Hostnamen von einer URL zu erhalten. Ich würde versuchen, eine dedizierte Bibliothek wie url-parse zu verwenden.

var URL = require('url-parse'); 
var url = new URL('http://www.google.com') 
console.log(url.hostname); // 'google' 

Ich bin nicht ganz sicher, was Sie checkForDuplicateUrl() vorbei sind, aber ich denke, das rund um die localhost Problem bekommt.

Verwandte Themen