Mocka tredjepartsbiblioteket (ioredis) i TypeScript-tester
Jag har svårare än förväntat att kunna mocka ett tredjepartsbibliotek i mina TypeScript-tester.
Jag håller på att skapa ett bibliotek baserat på detta typescript-starter-bibliotek. Det använder ava för testning.
I mitt fall försöker jag mocka huvudklassen av ioredis så att mina tester inte försöker sätta upp riktiga databaskopplingar.
Jag har försökt att använda sinon, testdouble.js och mockery.
I Sinon har jag försökt följande
let redisStub = sinon.stub(IORedis)
sinon.assert.called(redisStub.Cluster)
Med testdouble har jag försökt en hel massa saker, inklusive;
td.replace('ioredis') // #1
td.replace('./homeMadeIoredisWrapperClass') // #2
Jag har försökt med hån
mockery.enable()
mockery.registerMock('ioredis', {some: 'object'})
Jag har också provat många andra variationer, som att alltid använda require('ioredis') i metoderna
Försöker jag göra något omöjligt här? Jag trodde att det var väldigt vanligt att stuba/mocka en databas, men jag verkar inte kunna lista ut det.
Kanske är min design bristfällig och jag försöker kanske göra narr av fel saker? Lite hjälp skulle uppskattas mycket!
Ps. Om det spelar någon roll, försöker jag skapa en ganska enkel ioredis-anslutningswrapper.
Svar #1
Du kan imitera ioredis (version 4.16.2) med bara sinon. Du måste imitera connect-metoden.
import ioredis from "ioredis";
sinon.stub(ioredis.prototype, "connect").returns(Promise.resolve());
sinon.stub(ioredis.prototype, "get").returns(Promise.resolve({ data: "hello" }));
Svar #2
Jag hade ett par missförstånd/problem med min kod som orsakade detta. Kanske kan detta upplysa någon annan som snubblar över detta;
- Jag behövde "allting" (
import { MyLibrary } from "myLibrary") innantd.replacevilket gjorde att ersättningssatserna hände efter att koden hade krävt modulen. Anledningen var att exempeltesterna var designade på ett specifikt sätt i typescript-starter-repot. Jag har nu gjort en PR för att fixa det underliggande problemet. - Jag körde ava-testerna parallellt, vilket gjorde att
td.reset()hände innan några av mina callbacks hade körts, vilket effektivt förhindradereplaceatt fungera i många fall. Lösningen i ava är att användatest.serial(...istället förtest(.... Ja, testet kommer att köras långsammare, men de kommer att fungera. Du kan skapa en separat fil för varje test för att få verklig parallellkörning i ava.
Det finns också några användbara wiki-inlägg på testdouble GitHub-sida; https://github.com/testdouble/contributing-tests/wiki/Don%27t-mock-what-you-don%27t-own https://github.com/testdouble/contributing-tests/wiki/SAFE-test
Hoppas någon tycker detta är användbart.
