2017-03-29 3 views
0

Gerade begann mit Scherz und die Dokumentation scheint nicht zu klar zu spotten.Jest Mock-Funktion?

Ich habe ein Modul mit dem folgenden Code. Wenn ich die Funktion "Mail senden" testen möchte, aber keine E-Mail über Mailgun senden möchte, was muss ich hier tun? Ich denke, in meiner Testdatei muss ich das Scheinverhalten verwenden, aber ich kann nicht herausfinden, wie man das Ausgehen der Mail gezielt stoppt, während ich auch in der Lage bin, die richtigen Routen zu überprüfen, z. ungültige E-Mail-Adresse, Fehler ausgelöst, etc. Muss ich diese Funktion noch weiter abbrechen?

const Mailgun = require('machinepack-mailgun'); 
const Emailaddresses = require('machinepack-emailaddresses'); 
const config = require('../Config'); 


// Function to send an email 
const sendEmail = function (toaddress, toname, sub, msg, cb) { 
// Validate the email address is correct and if so send an email. Otherwise log the error and exit. 
    Emailaddresses.validate({ 
    string: toaddress, 
    }).exec({ 
    error(err) { 
     return cb(err, null); 
    }, 
    invalid() { 
     return cb(new Error('Email address is not valid.'), null); 
    }, 
    success() { 
     Mailgun.sendPlaintextEmail({ 
     apiKey: config.sender.apiKey, 
     domain: config.sender.domain, 
     toEmail: toaddress, 
     toName: toname, 
     subject: sub, 
     message: msg, 
     fromEmail: config.sender.fromEmail, 
     fromName: config.sender.fromName, 
     }).exec({ 
     error(err) { 
      return cb(err, null); 
     }, 
     success() { 
      return cb(null, 'Email Sent.'); 
     }, 
     }); 
    }, 
    }); 
}; 

module.exports.sendEmail = sendEmail; 

Antwort

2

können Sie verspotten Mailgun mit Ihrer eigenen Implementierung, die:

const Mailgun = require('machinepack-mailgun'); 
jest.mock('machinepack-mailgun',() = > ({ 
    sendPlaintextEmail: jest.fn() 
})) 
it('sends mail and fail',() = > { 
    // no add the way `sendPlaintextEmail` should react. 
    // in this case return `exec` which always run the `error` part 
    Mailgun.sendPlaintextEmail.mockImplementation(() = > ({ 
    exec: (arg) = > { 
     arg.error('someError') 
    } 
    })) 
    const cb = jest.fn() 
    sendEmail ('toaddress', 'toname', 'sub', 'msg', cb) 
    expect(Mailgun.sendPlaintextEmail).toHaveBeenCalledWith(...) 
    expect(cb).toHaveBeenCalledWith(...) 
}) 

Im obigen Beispiel verspotten wir das mailgun Modul, so dass sendPlaintextEmail ein Spion ist. Dann importieren wir das Modul in unseren Test, so dass wir die Spionage-Implementierung des Spions in jedem Test festlegen können. Im Beispiel setzen wir das Verhalten so, dass es die Methode exec zurückgibt, die dann von Ihrem Code mit dem Objekt error/success aufgerufen wird. Der Mock ruft dann einfach den error Teil an. Danach können Sie zuerst testen, dass Mailgun.sendPlaintextEmail mit den richtigen Parametern aufgerufen wurde, dann können Sie testen, dass cb mit "someError" und null aufgerufen wurde.

In einem anderen Test können Sie einfach das Verhalten von exec so einstellen, dass es die success Methode aufrufen wird.

+0

Danke Ich werde das heute Abend überprüfen und markieren, wenn keine weiteren Fragen. Schätzen Sie die Hilfe – munkee

+0

Scheinen Fehler zu schlagen Fehler: expect (jest.fn()) toHaveBeenCalledWith (erwartet) Mock Funktion Voraussichtlich mit genannt wurden. [ "[email protected]", „chris "," Betreff "," Nachricht "] Aber es wurde nicht aufgerufen. https://pastebin.com/rhxtjkLc – munkee

+0

Könnten Sie überprüfen, ob die Erfolgsfunktion der E-Mail-Validierung aufgerufen wurde, indem Sie eine 'console.log (Mailgun.sendPlaintextEmail)' hinzufügen. Was druckt es? die 'hasBeenCalledWith' sollte –