VoltRB rspec测试方法无法将Promise转换为Array

时间:2015-07-01 18:57:49

标签: ruby rspec voltrb

我正在尝试对我的模型中的方法进行一些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">

错误似乎正在发生,因为它会根据预期值测试承诺。为什么我会收到此错误?

2 个答案:

答案 0 :(得分:1)

使用report.name.value修复此问题

答案 1 :(得分:1)

在服务器上运行代码时,对store的调用将返回已解决的promise。但在客户端,承诺尚未得到解决。有人(忘记名字atm)正致力于直接向opal-rspec添加支持,但目前返回的诺言不会等待opal-rspec。该计划已经准备就绪,我们将为伏特添加更多工具,使开发人员更容易在MRI和蛋白石上进行测试(就像我们使用Volt本身一样)。

您可以在承诺上调用.value以获取其值,但前提是承诺已解决。更安全的方法是使用.then块:

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

希望这有帮助。