我试图通过查询Cassandra数据库来改进ActiveRecord模型的测试覆盖率,该模型创建一个CSV文件。我们使用RSpec。我很难弄清楚如何测试下面显示的cassandra_file
方法,因为它调用了cdbh
(如下所示),它创建了与Cassandra数据库的实时连接。使用RSpec测试依赖外部Cassandra调用的方法
我试图做这样的事情:
it 'copys from cassandra' do
cdbh = Cassandra.stub(:connect)
date = '2013/12/27'
expect(device).to receive(:save_csv).with(date, cdbh.execute(options))
device.raw_file(Date.new(2013,12,27))
end
但我得到这个错误:
Failures:
1) Device raw_file generic device copys from cassandra
Failure/Error: Unable to find matching line from backtrace
NoMethodError:
undefined method `stub' for Cassandra:Module
我看着处理磕碰API调用一些其他的问题,但大多数这些建议的宝石一样VCR的或webmock看起来像他们没有用于这个特定的用例,因为我没有试图复制HTTP请求。有没有更好的方法来测试这个?这是否是合理的测试,还是比它的价值更麻烦?
在此先感谢您的帮助!
型号方法:
def cassandra_file(date)
if customer.name.downcase == 'customer name'
q = 'SELECT * FROM readings WHERE device = ? and date in (?, ?, ?)'
return save_csv(
date,
cdbh.execute(q, guid, (date.to_date - 1).iso8601, date.to_date.iso8601, (date.to_date + 1).iso8601))
else
q = 'SELECT * FROM readings WHERE device = ? and date = ?'
return save_csv(
date,
cdbh.execute(q, guid, date.to_date.iso8601))
end
end
...
def cdbh
return unless ENV['CASSANDRA_HOSTS']
@cdbh ||= Cassandra.connect(hosts: ENV['CASSANDRA_HOSTS'].split(/,/)).connect('hurricane')
end
感谢您的彻底回应。我的目标是重构这些代码,并按照你的说法进行操作,并将所有位提取到不同的方法中。然而,我想保证我不会退化功能,因此我想在试图拆分别人的代码之前先用测试覆盖当前的代码。有什么建议吗? – styger 2014-12-09 00:37:12
一个想法是,如果您在重构之前需要保证,您可以编写一个“哑”测试来验证函数的正常输出,而不会引入查询存根的复杂性。 (换句话说,为什么要花费更多的时间,如果它会发生变化?)如果暂时放慢你的测试套件的多少并不重要。只是一个想法... – 2014-12-09 00:54:35