2017-04-26 1 views
0

私が見ている振る舞いには本当に混乱しています。私のスパイは引き続き議論を誤っている。同じシグネチャと引数を持つ同一の関数を作成し、それを別々にスパイすると、コピーは正常に動作します。私はは何が起こっていることができません!Sinonスパイは1つの関数の引数が間違っていますが、別の関数では成功します。

だから、ここのコードです:

NB:alerttestは、私は何が起こっているのか確認するために作成された新しいもので、本来の機能です。

# index.js 
class Alerter { 

    getOnErrorFn(name) { 
    return (error) => { 
     ... 
     alert = { 
     opts: { 
      tags: 'Unknown Error' 
     } 
     } 
     ... 

     if (alert) { 
     this.test(name, error.message, Object.assign({}, alert.opts, {smc_error: error.toLog()}), alert.level); 
     this.alert(name, error.message, Object.assign({}, alert.opts, {smc_error: error.toLog()}), alert.level);   } 
    }; 
    } 

    test(serviceName, message, opts={}, level=this.CRITICAL) { 
    console.log(serviceName, message, opts, level); 
    } 

    alert(serviceName, message, opts={}, level=this.CRITICAL) { 
    console.log(serviceName, message, opts, level); 
    ... 
    } 

私のテストコードです(他のテストはすべてコメントアウトされていますが、これはテストスイートの唯一のファイルです)。

# alerter.spec.js 
const sandbox = sinon.sandbox.create(); 

describe('Alerter', function(){ 

    let alerter; 
    let name = 'test-service'; 
    let message = 'test message'; 

    beforeEach(() => { 
    alerter = new Alerter(name); 
    }); 

    afterEach(() => { 
    sandbox.restore(); 
    }); 

    describe('getOnErrorFn()',() => { 
    it.only('handles non-SMCError errors and assumes they should be alerted',() => { 
     const spy = sandbox.spy(alerter, 'test'); 
     const spi = sandbox.spy(alerter, 'alert'); 
     const onError = alerter.getOnErrorFn(name); 

     const error = new Error(); 
     const smcError = SMCError.from(error); 
     onError(error); 
     expect(spy).to.have.been.calledWith(name, smcError.message, {smc_error: smcError.toLog(), tags: 'Unknown Error'}, undefined); 
     expect(spi).to.have.been.calledWith(name, smcError.message, {smc_error: smcError.toLog(), tags: 'Unknown Error'}, undefined); 
    }); 

    }); 

}); 

これはテストの結果です....私の絶対的なナットをしている!

$ npm test 

> [email protected] test /Users/al/Studio/Projects/smc/app/smc-alerting 
> mocha test/**/*.spec.js 



    Alerter 
    getOnErrorFn() 
TEST test-service Caught Error { tags: 'Unknown Error', 
    smc_error: 'Error Caught Error\n caused by: Caught Error' } critical 
ALERT test-service Caught Error { tags: 'Unknown Error', 
    smc_error: 'Error Caught Error\n caused by: Caught Error' } critical 
     1) handles non-SMCError errors and assumes they should be alerted 


    0 passing (34ms) 
    1 failing 

    1) Alerter getOnErrorFn() handles non-SMCError errors and assumes they should be alerted: 
    expected alert to have been called with arguments test-service, Caught Error, { 
    smc_error: "Error Caught Error 
    caused by: Caught Error", 
    tags: "Unknown Error" 
}, undefined 
    alert(test-service, Caught Error, { smc_error: "Error Caught Error 
    caused by: Caught Error" }, undefined) at /Users/al/Studio/Projects/smc/app/smc-alerting/src/index.js:46:14 
    AssertionError: expected alert to have been called with arguments test-service, Caught Error, { 
    smc_error: "Error Caught Error 
    caused by: Caught Error", 
    tags: "Unknown Error" 
    }, undefined 
     alert(test-service, Caught Error, { smc_error: "Error Caught Error 
    caused by: Caught Error" }, undefined) at src/index.js:46:14 
     at Context.it.only (test/index.spec.js:173:32) 



npm ERR! Test failed. See above for more details. 

だから、両方console.log文が同じ結果を印刷することに注意してください。しかし、alert関数のスパイは、ファンクションがtagsプロパティが3番目の引数から抜けて呼び出されたことを示す印刷結果で失敗します。 WTF!

ここで起こっていることが分からないことがありますか?

すべてのご協力をよろしくお願いいたします。前もって感謝します!

答えて

0

ダルニット。答えを得ました。短いストーリー:不変のオブジェクトを使用してください!

alert()は、後にラインがあった時に元のオブジェクトを変更したコードを後で確認していました。

関連する問題