2017-02-09 13 views
2

допустим у меня есть функцияКак издеваться над функцией внутри другой функции (которую я тестирую) с помощью синона?

Func a() 
{ 
//Do Something 
let c = b(); 
return c; 
} 

Я хочу, чтобы проверить функцию а и напускной Ь() и в издеваться хотите назначить гр. Sinon.Stub (Test, "b"). Возвращает ("DummyValue"); c должен назначаться DummyValue.

Как я могу это сделать?

describe("a",()=>{ 
let a = a(); 
//mock b(); 
action = execute(a); 
expect(action).should.return.("DummyValue"); 
}) 

ответ

0

В этом случае Sinon заглушка является более подходящим, то притворно Когда использовать издевается против окурков?

Правило: если вы не добавить утверждение для некоторого конкретного вызова, не высмеивать его. Вместо этого используйте заглушку.

Наше утверждение в тесте не относится к конкретному вызову функции a i.e 1-го или 3-го вызова, а относится ко всем вызовам.

Мы можем это сделать, потому что мы запрограммировали наш заглушка, чтобы всегда возвращать тот же результат независимо от способа его вызова (аргументы или количество вызовов).

Передача функции блокировки sinon как аргумент функции a.

Function a(b) { 
    const c = b(); 

    return c; 
} 

test.js

require("sinon") 

describe("a",() => { 
    const stub = sinon.stub(); 
    stub.returns("DummyValue"); 
    expect(a(stub)).to.eql.("DummyValue"); 
}) 

Обратите внимание, что мы можем использовать сопзЬ эти объявления переменных, поскольку они никогда не переподчиняемых.

+0

Я не хочу, чтобы передать функцию/окурок в качестве параметра. Я хочу сделать это, не передавая функцию b. Является ли это возможным? –

+0

Это возможно, но не рекомендуется через что-то вроде библиотеки rewire. Патч обезьяны - это искусство изменения модуля или пакета во время выполнения, чтобы изменить ход выполнения. Таким образом, вы были бы патчем обезьян. Я считаю, что мой подход проще, чем установка внешнего модуля для изменения исполнения во время выполнения. – therewillbecode

0

Вы можете окурок функцию только

  • , если передать его в качестве параметра анс подделать с помощью теста удваивает библиотеку как sinon
  • или, если это зависимость (загружается через import или require). В таком случае вы можете использовать proxyquire, чтобы передать свою фальшивую функцию b для тестируемого модуля. Сама функция может быть подделана sinon или другой библиотекой тестовых удвоений.
0

Когда у нас есть 2 функции в одном файле и вы хотите заглушить один из них и проверить другой. Например ,: Test: tests.js

let ComputeSumStub = sinon.stub(OfflineLoader, "ComputeSum"); 
const ans = function() 
{ 
return 10; 
}; 
ComputeSumStub.returns(ans); 
const actualValue: number = OfflineLoader.sum(); 
expect(actualValue).to.be.equal(10); 

Dev: foo.js

function sum(): number 
{ 
     return ComputeSum(8, 9); 
} 

function ComputeSum(a: number, b: number): number 
{ 
     return a + b; 
} 

Мы не можем сделать это, потому что после компиляции функции экспортируются с разными подписями, с полным именем и в то время как stubbing мы заглушаем глобальную функцию, но, вызывая ее из другой функции, мы вызываем локальную функцию, поэтому она не работает. Существует обходное решение для этого.

foo.js 
const factory = { 
    a, 
    b, 
} 
function a() { 
    return 2; 
} 

function b() { 
    return factory.a(); 
} 

module.exports = factory; 

test.js

const ser = require('./foo'); 
const sinon = require('sinon'); 

const aStub = sinon.stub(ser, 'a').returns('mocked return'); 
console.log(ser.b()); 
console.log(aStub.callCount); 

Ref: Stubbing method in same file using Sinon