2014-12-06 63 views
1

我试图通过查询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 

回答

1

在我看来,你是在正确的轨道上磕碰上 - 模型/单元测试“应该”测试消息传递(而数据库的交互是通过有效整合覆盖/验收测试)。

但是我认为你的方法虽然不是太复杂,但是试图做得太多,这会影响你编写干净测试的能力。 (对我来说,代码是说:“我在哪里坚持这个存根?”,几乎那种在那里骂它!)

一个简单的建议可能会提取一些方法,甚至类,因为它似乎cassandra_fileraw_file?)有多个输入/输出或副作用,并且变得有点纠结。

它让人想起来自SOLID名气的单一责任原则(尽管有人说这是用Ruby中的方法描述的can't)。我看到有条件的查询生成,数据库(外部系统)调用和文件输出。尽管这是一个相对较短的方法,但仍有很多事情要做!

目前的一所学校有模型处理这一切 - 这些都是PORO,“外包”到/ lib或其他地方,而让ActiveRecord模型成为模型。 (所以瘦身控制器/胖子模型被认为是第一步,这可能是下一步。)

如果你有时间和倾向,我建议花更多时间研究这个主题,因为有许多文章作为以及Ruby讨论会上的有趣演讲。 (目前我真的从Sandi Metz中挖出任何东西)。

如果没有,我会说你很接近,也许只是按照建议提取一些方法,并简化模型,使测试更容易一点对你自己。

+0

感谢您的彻底回应。我的目标是重构这些代码,并按照你的说法进行操作,并将所有位提取到不同的方法中。然而,我想保证我不会退化功能,因此我想在试图拆分别人的代码之前先用测试覆盖当前的代码。有什么建议吗? – styger 2014-12-09 00:37:12

+0

一个想法是,如果您在重构之前需要保证,您可以编写一个“哑”测试来验证函数的正常输出,而不会引入查询存根的复杂性。 (换句话说,为什么要花费更多的时间,如果它会发生变化?)如果暂时放慢你的测试套件的多少并不重要。只是一个想法... – 2014-12-09 00:54:35