Użyj sinon.js, aby utworzyć „obiekt szpiegowski” za pomocą metod szpiegowskich opartych na prawdziwym konstruktorze / prototypie

Używam sinon.js jako sposobu na wyeliminowanie zależności w moich testach Mocha. Wolę podejście „szpiegowskie” niż klasyczne podejście próbne, ponieważ introspekcja szpiega wydaje się jaśniejsza i zapewnia większą elastyczność niż nieco wsteczne myślenie z klasycznymi próbnymi obiektami.

Powiedziawszy to, zastanawiam się, czy używam go niepoprawnie, jeśli chodzi o tworzenie szpiegów testowych dla całych obiektów. Powiedzmy, że mam zależność testową, która ma 4 metody, a ja chcę przypisać każdą z tych metod i wykonać asercje na jednym lub dwóch z nich. Obecnie robię to:

var spyObj = {
  aMethod: sinon.spy(),
  otherMethod: sinon.spy(),
  whatever: sinon.spy()
};

Następnie pytam o takie rzeczyspyObj.aMethod.calledWith(a, b, c).

Czy istnieje lepszy sposób na wykreślenie całej klasy niż powtórzenie nazw metod w samym zestawie testów? Wygląda na to, że sinon.stub () próbuje iterować po całym elemencie danego obiektu, ale to nie wydaje się działać jako sposób na uzyskanie wszystkich metod dla większości obiektów w bardziej nowoczesnych środowiskach wykonawczych JS, takich jak V8, chyba że obiekt jest w rzeczywistości czymś wymownym. Próbuje również połączyć poprawkę z rzeczywistym obiektem, zamiast zwracać równoważny obiekt, co jest nieco niepożądane. Potrzebuję tylko obiektu zgodnego z interfejsem, ale zachowującego się jak obiekt zerowy, chyba że powiem inaczej.

Dobrze byłoby móc zrobić coś takiego:

var spyObject = sinon.spy(MyClass.prototype);

W jaki sposób znaleźć wszystkie metody konstruktora / prototypu w Node.js, aby stworzyć opakowanie takie jak powyżej?

Chodzi tu raczej o wygaszanie logiki, niż testowanie wywołań na wielu metodach (które próbuję ograniczyć do jednego, lub na dwa). Na przykład rzeczy, które mogą powodować niechciane operacje we / wy lub wymagają dodatkowych złożonych urządzeń, jeśli zostaną wykonane.

questionAnswers(2)

yourAnswerToTheQuestion