Beschreibe den Fehler
createStubInstance
ignoriert eigene Eigenschaften und ist bei einer Superklasse blind gegenüber ihren geerbten Methoden und Eigenschaften
Fortpflanzen
class SubTest {
name;
constructor({ name }) { this.name = name }
something() {}
}
export default class SuperTest extends SubTest {
description;
constructor(...props) {
super(props);
this.description = props.description;
}
noop() {}
}
import sinon from 'sinon';
import SuperTest from './SuperTest.js';
sinon.createStubInstance(SuperTest, {
description: 'Lorem Ipsum',
name: 'Foobar',
noop() {},
something() {},
});
Error: Cannot stub description. Property does not exist!
at …/sinon/lib/sinon/stub.js:129:19
at Array.forEach (<anonymous>)
at stub.createStubInstance (…/sinon/lib/sinon/stub.js:120:5)
nachdem ich description: 'Lorem Ipsum',
:
Error: Cannot stub name. Property does not exist!
at …/sinon/lib/sinon/stub.js:129:19
at Array.forEach (<anonymous>)
at stub.createStubInstance (…/sinon/lib/sinon/stub.js:120:5)
nachdem ich auch name: 'Foobar',
:
Error: Cannot stub something. Property does not exist!
at …/sinon/lib/sinon/stub.js:129:19
at Array.forEach (<anonymous>)
at stub.createStubInstance (…/sinon/lib/sinon/stub.js:120:5)
Mit nur noop() {}
in den Überschreibungen funktioniert es.
Erwartetes Verhalten
Ich erwarte, dass createStubInstance
alle Felder, die in der bereitgestellten Klasse vorhanden sind, stubt.
Kontext (bitte füllen Sie die folgenden Informationen aus):
BEARBEITEN : Ich habe den obigen Test ursprünglich zu stark vereinfacht und super()
weggelassen, aber es hatte keine Auswirkung auf das Verhalten von Sinon. Der obige Test ist korrigiert.
Danke, dass du das ansprichst. Hier sind mehrere Dinge falsch oder werden missverstanden:
createStubInstance
ist nicht dokumentiert (ich wusste es nicht einmal 😄).In der Dokumentation wird ausdrücklich darauf hingewiesen, dass
Die angegebene Konstruktorfunktion wird nicht aufgerufen.
Die Annahme, dass es verwendet werden kann, um Anfangsargumente zu übergeben, kann also nicht funktionieren.
{ something: sinon.stub() }
).{ something: 42 }
).Dies erfordert eindeutig eine bessere Dokumentation, aber es ist kein Fehler.
So können Sie Ihren Anwendungsfall zum Laufen bringen:
Beachten Sie, dass Sie ein neues Objekt aus dem Prototyp "Klasse" erstellen. Sie erstellen keine Instanz der Klasse, da der Konstruktor nicht aufgerufen wird. Grundsätzlich hat der Rückgabewert von createStubInstance
nur die gleiche Schnittstelle wie Ihre Klasse, wobei alle Funktionen durch Stubs ersetzt werden. Wenn Sie Eigenschaften für diese Stub-Instanz benötigen, können Sie sie daher einfach zuweisen.
vielen Dank für Ihre schnelle Antwort!
Beachten Sie, dass Sie ein neues Objekt aus dem Prototyp "Klasse" erstellen. Sie erstellen keine Instanz der Klasse, da der Konstruktor nicht aufgerufen wird. Grundsätzlich hat der Rückgabewert von
createStubInstance
nur die gleiche Schnittstelle wie Ihre Klasse, wobei alle Funktionen durch Stubs ersetzt werden. Wenn Sie Eigenschaften für diese Stub-Instanz benötigen, können Sie sie daher einfach zuweisen.
Könnte es sich lohnen, dies innerhalb von createStubInstance zu unterstützen?
function createStubInstance (…) {
// …
return Object.assign(stubbedInstance, propertyValuePairs); // anything it doesn't recognise
}
@jshado1 Klar, das könnten wir machen. Wer sich für dieses Feature interessiert, kann gerne einen Pull Request senden 🙂