2016-08-17 15 views
0

javascriptプログラム用のテストコードを書く際に、私は奇妙な説明できない動作を発見しました。 res.bodyの出力を比較して、文字列が含まれているかどうかを確認していました。javascript indexOf奇妙な振る舞い

もっと正確には、res.bodyに文字列 'channel'が含まれているかどうかを確認していました。

出力に実際にその文字列が含まれていても、テストケースは常に失敗していました。私はデバッグモードでプログラムを実行し、なぜ失敗しているのかを調べました。結果は最も難しいと言えば困惑しています。

> res.body 
'Error: invalid channnel' 
> res.body.indexOf('channel') 
-1 
> res.body.indexOf('channe') 
-1 
> res.body.indexOf('chann') 
15 
> 

私は、その値だったres.bodyの「チャンネル」ののindexOfをチェックしようとすると「エラー:無効なチャンネル」、Iは正の値を取得することになって、それが与えられた-1。

ですから、検索文字列を減らして 'チャンネル'だけを含む、つまり 'el'を省略するまで、それはまだ失敗します。

しかし、私は文字列litteralを取り、同じ演習を行う場合、この動作は起こりません。たとえば、以下は完全に機能します。

> 'Error: invalid channel'.indexOf('channel') 
15 

私は先に進み、res.bodyのタイプをチェックし、文字列として表示し、オブジェクトは表示しません。

> typeof res.body 
'string' 
> 

誰も同じような問題に直面しましたか?またはこれに説明がありますか?

編集 私がres.bodyをmocha + chaiフレームワークで作成したときに起こります。完全なコードは以下の通りです:

58 it ("Should fail with 400, if invalid channel", function(done) { 
59  chai.request(app).post('/campaigns/js') 
60  .send(samples.type0.invalidChannel) 
61  .end(function(err, res) { 
62  console.log("response:", res.body); 
63  expect(res).to.have.status(400); 
>64  debugger; 
65  expect(res.body).to.contain('channel'); 
66  return done(); 
67  }); 
68 }); 
+0

* cha ** nnn ** el *は* cha ** nn ** el *と同じではありません。 –

+0

''エラー:チャンネルが無効です ''チャンネルのスペルが間違っています – z0mBi3

答えて

3

あなたはres.bodyは3つのn sのchannelを持っています。

'Error: invalid channnel'

これはそのchannマッチを意味するが、channeがあるため、余分なnのではないでしょう。

+0

ああ、私の目が悪いです。私は年をとっているかもしれません:( –

0

最初のコードでは、 "channnel"には3 nがあります。それが「チャンネル」にマッチしたものの、「チャンネル」にマッチしなかった理由です。

+0

@Soviutによって既に与えられた答え –

+0

あなたのすべてにThx。私はこれで4時間を無駄にしました。時々私はこれほど馬鹿になることがあります。 –