我正在尝试对我的模型中的方法进行一些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">
错误似乎正在发生,因为它会根据预期值测试承诺。为什么我会收到此错误?
答案 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
希望这有帮助。