Sinon: createStubInstance stubt keine eigenen Eigenschaften oder etwas Vererbtes

Erstellt am 23. Jan. 2021  ·  3Kommentare  ·  Quelle: sinonjs/sinon

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):

  • Bibliotheksversion: [email protected]
  • Umfeld:
    macOS 11.1
    Knoten 15.6.0
    npm 7,4
  • Andere Bibliotheken, die Sie verwenden:
    chai 4.2.0
    sinon-chai 3.5.0

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.

Easy Documentation Help wanted

Alle 3 Kommentare

Danke, dass du das ansprichst. Hier sind mehrere Dinge falsch oder werden missverstanden:

  • Das zweite Argument auf 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.

  • Die vorhandene Implementierung dieser undokumentierten Funktion tut dies:

    • Wird ausgelöst, wenn die Eigenschaft nicht überschreibbar ist, weil sie in der Stub-Instanz nicht vorhanden ist. Dies ist in Ihrem Fall der Fall. Der Konstruktor wurde nicht aufgerufen und daher sind Ihre "Member"-Eigenschaften nicht vorhanden.

    • Wenn ein gegebener Override ein Stub ist, ersetzen Sie den Standard-Stub durch den angegebenen (zB { something: sinon.stub() } ).

    • Andernfalls muss der Standard-Stub den angegebenen Eigenschaftswert zurückgeben (zB { 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 🙂

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen