2017-01-12 4 views
0

Ich versuche, eine Aktion von redux, die eine Pfeilfunktion hat, zu behaupten, und da es eine neue Referenz erstellt, kann ich es nicht mit Chai geltend machen. HierAssert Pfeilfunktion auf Mokka

ist der Code:

export function save(product) { 
    return { 
    types: ['REQUEST', 'SUCCESS', 'FAILED'], 
    callAPI:() => fetchSomething() 
    payload: { 
     product 
    } 
    }; 
} 

export function saveOrUpdate(product) { 
    return product.id ? update(product) : save(product); 
} 

Und ich versuchte, so etwas wie dieses auf meinem Test zu tun:

const action = saveOrUpdate(product); 
expect(action).to.be.eql(save(product)); 

Dies nicht gearbeitet haben, wegen der callAPI Eigenschaft, also habe ich chai-Teilmenge versucht mit diesem Ansatz die Eigenschaft callAPI zu ignorieren, aber es fühlt sich an wie Hack:

const action = saveOrUpdate(product); 
const {types, payload} = save(product); 
expect(action).to.containSubset({ 
    types, 
    payload 
}); 

gibt es trotzdem mit dem ersten Ansatz behaupten?

Danke !!

+0

Ich denke, das Problem ist, dass Sie 'save' als Parameter für' eql' Funktion aufrufen. Vielleicht müssen wir einen anderen Weg finden zu überprüfen, dass 'save' aufgerufen wurde anstelle von' update' – alayor

Antwort

0

Wie Sie herausgefunden, wie Sie Ihren Code jedes Mal, wenn die save Funktion aufgerufen wird, muss die JavaScript virtuelle Maschine eine neue Function Instanz erstellen. Sie könnten das einfach durch einen Verweis auf eine einzelne Funktion ersetzen, die ein für allemal erstellt wird und wiederverwendet wird. Dies würde das Testen auf Gleichheit trivial machen.

Wenn Sie besorgt über callAPI mit schlechten Argumente aufgerufen werden, können Sie fetchSomething wie ich hier wickeln;

function callFetchSomething() { 
    fetchSomething(); 
} 

export function save(product) { 
    return { 
    types: ['REQUEST', 'SUCCESS', 'FAILED'], 
    callAPI: callFetchSomething, 
    payload: { 
     product 
    } 
    }; 
} 

Wenn Sie keinen Schutz vor falschen Anrufen benötigen, dann könnte man nur callAPI: fetchSomething haben.

+0

Danke @Louis! Dies war der einzige Weg, der mir in den Sinn kam ... –

0

Ich denke, Sie können Chai Spies verwenden, um zu überprüfen, dass save Methode aufgerufen wurde.

var spy = chai.spy(save); 
const action = saveOrUpdate(product); 
expect(spy).to.have.been.called();