Sinon.js ile bir sınıf yöntemini saplama


99

Sinon.js kullanarak bir yöntemi saplamaya çalışıyorum ancak aşağıdaki hatayı alıyorum:

Uncaught TypeError: Attempted to wrap undefined property sample_pressure as function

Ben de bu soruya gittim ( sinon.js'de bir sınıfı saplama ve / veya alay etme? ) Ve kodu kopyalayıp yapıştırdım ama aynı hatayı alıyorum.

İşte kodum:

Sensor = (function() {
  // A simple Sensor class

  // Constructor
  function Sensor(pressure) {
    this.pressure = pressure;
  }

  Sensor.prototype.sample_pressure = function() {
    return this.pressure;
  };

  return Sensor;

})();

// Doesn't work
var stub_sens = sinon.stub(Sensor, "sample_pressure").returns(0);

// Doesn't work
var stub_sens = sinon.stub(Sensor, "sample_pressure", function() {return 0});

// Never gets this far
console.log(stub_sens.sample_pressure());

Yukarıdaki kod için jsFiddle ( http://jsfiddle.net/pebreo/wyg5f/5/ ) ve bahsettiğim SO sorusu için jsFiddle ( http://jsfiddle.net/pebreo/9mK5d/1/ ).

JsFiddle ve hatta jQuery 1.9'daki Harici Kaynaklara sinon eklemeyi sağladım . Neyi yanlış yapıyorum?

Yanıtlar:


155

Kodunuz bir işlevi çalıştırmaya çalışıyor Sensor, ancak işlevi açık olarak tanımladınız Sensor.prototype.

sinon.stub(Sensor, "sample_pressure", function() {return 0})

esasen bununla aynıdır:

Sensor["sample_pressure"] = function() {return 0};

ama bunun olmadığını görecek kadar akıllı Sensor["sample_pressure"].

Öyleyse yapmak isteyeceğiniz şey şuna benzer:

// Stub the prototype's function so that there is a spy on any new instance
// of Sensor that is created. Kind of overkill.
sinon.stub(Sensor.prototype, "sample_pressure").returns(0);

var sensor = new Sensor();
console.log(sensor.sample_pressure());

veya

// Stub the function on a single instance of 'Sensor'.
var sensor = new Sensor();
sinon.stub(sensor, "sample_pressure").returns(0);

console.log(sensor.sample_pressure());

veya

// Create a whole fake instance of 'Sensor' with none of the class's logic.
var sensor = sinon.createStubInstance(Sensor);
console.log(sensor.sample_pressure());

1
Hangi şey kullanımdan kaldırıldı?
loganfsmyth

sinon.stub (Sensör, "sample_pressure", function () {return 0})
danday74

Cevabım bu, çünkü asıl soru özellikle bunu sordu. Cevabımın bunu başlangıçta doğru yaklaşım olarak önermediği göz önüne alındığında, benden neyi değiştirmemi istediğinizden emin değilim. .returns(0)zaten aynı şeyi yapıyor .callFake(() => 0).
loganfsmyth

1
Görünüşe göre returnskullanımdan kaldırılmış değil. sinonjs.org/releases/v3.0.0/stubs . @ danday74, lütfen referansı sağlayın.
allenhwkim

2
@ danday74 .stubüçüncü bağımsız değişken olarak bir işlevle kaldırılır: github.com/sinonjs/sinon/blob/master/lib/sinon/stub.js#L17.returns veya ile ilgili yanlış bir şey yok .callsFake, bu nedenle bu yanıtta yanlış bir şey yok.
loganfsmyth

52

En iyi cevap kullanımdan kaldırıldı. Şimdi kullanmalısınız:

sinon.stub(YourClass.prototype, 'myMethod').callsFake(() => {
    return {}
})

Veya statik yöntemler için:

sinon.stub(YourClass, 'myStaticMethod').callsFake(() => {
    return {}
})

Veya basit durumlar için sadece iadeleri kullanın:

sinon.stub(YourClass.prototype, 'myMethod').returns({})

sinon.stub(YourClass, 'myStaticMethod').returns({})

Veya bir örnek için bir yöntemi saplamak istiyorsanız:

const yourClassInstance = new YourClass();
sinon.stub(yourClassInstance, 'myMethod').returns({})

4
Söz konusu yönteme eklendiğinde, söz konusu yönteme özel sürümden bahsedebilirseniz harika olur, sinonjsyani callsFake()daha eski sürümler için bu nasıl kaldırılabilir?
aitchkhan

3
ES6 modüllerini kullanırken: Bir test projesinde YourClass.get () saplamasını oluşturuyorum. Test, YourClass'ı içe aktaran başka bir modülü çağırır. YourClass.get () modülü saplamaya saygı gösterir mi? Değilse, bir çözüm var mı?
Öğrenci

1
Çözümleriniz benim için çalışıyor. Keşke size daha fazla puan versem: D Teşekkürler.
Rubel hasan

5

Sinon kullanarak CoffeeScript sınıfının bir yöntemiyle dalga geçmeye çalışırken aynı hatayla karşılaştım.

Böyle bir sınıf verildiğinde:

class MyClass
  myMethod: ->
    # do stuff ...

Yöntemini bir casusla şu şekilde değiştirebilirsiniz:

mySpy = sinon.spy(MyClass.prototype, "myMethod")

# ...

assert.ok(mySpy.called)

Sadece değiştirmek spyile stubveya mockgerektiği gibi.

assert.okTest çerçevenizin sahip olduğu iddia ile değiştirmeniz gerekeceğini unutmayın .


2

Bahşiş için @loganfsmyth'e teşekkürler. Saplama, Ember sınıfı bir yöntem üzerinde şu şekilde çalışmasını sağladı:

sinon.stub(Foo.prototype.constructor, 'find').returns([foo, foo]);
expect(Foo.find()).to.have.length(2)

3
Bu bir yorumdur. Başka bir cevaba teşekkür ederek başlar ve kodunun tekrarlanmasıyla biter.
michelpm

5
Bir çoğaltma gibi görünmüyor - işte burada, Foo.prototype.constructororijinal cevapta olduğu gibi Sensor.prototype. Sonra yine, Foo.prototype.constructorbenim için çalışmıyor. :)
shaunc
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.