2017-01-17 27 views
7

Ben örneğin, belirli argümanlarla denir sadece ama eğer Jest sahip bir işlev alay etmek istiyorum:Fonksiyonları Jest'i kullanarak belirli argümanlar ile alay edebilir miyim?

class Math 
    def self.sum(x, y) 
    return x + y 
    end 
end 

allow(Math).to receive(:sum).with(1, 1).and_return(4) 
Math.sum(1, 1) # returns 4 (mocked) 
Math.sum(1, 2) # returns 3 (not mocked) 
: Ruby'nin RSpec kütüphanesinde uygulanan benzer bir özelliği yoktur

function sum(x, y) { 
    return x + y; 
} 

// mock sum(1, 1) to return 4 
sum(1, 1) // returns 4 (mocked) 
sum(1, 2) // returns 3 (not mocked) 

0123:

ne benim testlerde elde etmek çalışıyorum daha iyi bir ayırma olduğunu, bu reklam sum dayanan bir işlevi test etmek istiyorum diyelim

sum = jest.fn(function (x, y) { 
    if (x === 1 && y === 2) { 
    return "anything I want"; 
    } else { 
    return sum(x, y); 
    } 
}); 

expect(sum2(1)).toBe("anything I want"); 

Ama bunu basitleştirmek için biraz şeker işlevi olsaydı çok güzel olurdu:

function sum2(x) { 
    return sum(x, 2); 
} 

// I don't want to depend on the sum implementation in my tests, 
// so I would like to mock sum(1, 2) to be "anything I want", 
// and so be able to test: 

expect(sum2(1)).toBe("anything I want"); 

// If this test passes, I've the guarantee that sum2(x) is returning 
// sum(x, 2), but I don't have to know what sum(x, 2) should return 

Ben böyle bir şey yaparak bu uygulamak için bir yol olduğunu biliyoruz.

Kulağa mantıklı geliyor mu? Bu özelliği Jest'te zaten var mı?

Geri bildiriminiz için teşekkür ederiz.

cevap

4

Hayır, bunu Jest'te henüz yapmanın bir yolu yok. Bunun için sinons stubs'u kullanabilirsiniz. Şu dokümanlardan:

stub.withArgs (arg1 [, arg2, ...]);

Yalnızca tarafından sağlanan argümanlar için yöntemi koyar. Bu, casusluğa aynı aramayla erişebileceğiniz iddialarınızda daha etkileyici olmak için kullanışlıdır. , farklı argümanlara yanıt olarak farklı davranabilen bir saplama oluşturmak için de yararlıdır. Ben Stubbed/alay çağrısından farklı dönen sonucu gerektiren farklı parametrelerle denilen aynı yöntemi vardı sayede

"test should stub method differently based on arguments": function() { 
    var callback = sinon.stub(); 
    callback.withArgs(42).returns(1); 
    callback.withArgs(1).throws("TypeError"); 

    callback(); // No return value, no exception 
    callback(42); // Returns 1 
    callback(1); // Throws TypeError 
} 
1

Bu yardımcı olabilir ...

Benzer bir şey vardı. Sıralı hizmete çağrı yaptığımda işlevlerin bir listesiyle bir değişken kullandım; Test ettiğiniz yürütme sırasının bilgisini gerektirir ve cevabı argümanla değiştirmeyi gerçekten gerektirmez, ancak jestdeki kısıtlama etrafında çalışmamı sağladı.

var mockedQueue = []; 
mockedQueue.push(() => {return 'A';}) 
mockedQueue.push(() => {return 'B';}) 

service.invoke = jest.fn(()=>{ 
    serviceFunctionToCall = mockedQueue.shift(); 
    return serviceFunctionToCall(); 
})