2

モデルのメソッドでいくつかの rspec 単体テストを実行しようとしています。このメソッドは promise を返し、解決されるとその人の名前を返します。正しく動作することがわかっているので、この方法は問題ではありません。ここに私のテストコードがあります:

it 'should return correct name' do
  report = Report.new(first_name: 'Testy', last_name: 'Testerson')
  report.save!
  expect(report.name).to eql('Testy Testerson')
end

テストすると、次のエラーが表示されます。

Failure/Error: expect(report.name).to eql('Testy Testerson')
TypeError:
  can't convert Promise to Array (Promise#to_ary gives Promise)

デバッグ中に、次の行を使用してメソッドの戻り値を調べました。

puts report.name.inspect

そして、私は次の応答を得ました:

#<Promise(70319926955580): "Testy Testerson">

期待値に対してプロミスをテストするため、エラーが発生しているようです。このエラーが発生するのはなぜですか?

4

2 に答える 2

1

report.name.value を使用すると、この問題が修正されます

于 2015-07-01T19:40:18.167 に答える
1

サーバー上でコードを実行する場合、store の呼び出しは、解決済みの promise を返します。しかし、クライアントでは、約束はまだ解決されません。誰か (atm という名前は忘れてください) が opal-rspec に直接 promise のサポートを追加しようと取り組んでいますが、現時点では、返された promise は opal-rspec を待ちません。準備が整ったら、開発者が MRI と opal の両方で簡単にテストできるように、より多くのツールを volt に追加する予定です (Volt 自体で行っているように)。

promise で .value を呼び出してその値を取得できますが、promise が解決された場合に限ります。より安全な方法は、.then ブロックを使用することです。

report.name.then do |name|
  expect(name).to eq('Bob')
end

うまくいけば、それは役に立ちます。

于 2015-07-01T20:52:43.697 に答える