2

我正在尝试对模型中的方法进行一些 rspec 单元测试。该方法返回一个承诺,并在解决时返回人名。该方法不是问题,因为我知道它可以正常工作。这是我的测试代码:

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)正在努力将对 Promise 的支持直接添加到 opal-rspec 中,但目前返回的 Promise 不会等待 opal-rspec。该计划一旦准备就绪,我们将向 volt 添加更多工具,以使开发人员更容易在 MRI 和蛋白石中进行测试(就像我们对 Volt 本身所做的那样)。

你可以在 promise 上调用 .value 来取回它的值,但前提是 promise 已经解决。更安全的方法是使用 .then 块:

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

希望这会有所帮助。

于 2015-07-01T20:52:43.697 回答