【问题标题】:How to mock mongodb in rspec (beginner)如何在 rspec 中模拟 mongodb(初学者)
【发布时间】:2020-04-15 20:57:28
【问题描述】:

我是一名老程序员,但对 ruby​​ 很陌生,并且被扔到了一个现有的代码库中,我需要在其中扩展一个 rspec 测试。

需要测试的代码使用的是MongoDB(mongoid),有类似这样的模式:

 objects = Database::MyTable.active.where(object_id: object_id).to_a

我希望我的 rspec 代码在测试中提供硬编码的 objects。我该怎么做?

【问题讨论】:

  • 您是否考虑过使用数据库夹具,而不是使您的 rspec 测试复杂化?在 Rails 中,模式是有一个单独的数据库用于测试,并带有种子数据库固定装置。
  • 似乎是一种更好的方法,但我受到现有技术的限制。

标签: ruby mongodb rspec mongoid


【解决方案1】:

由于方法的“链式”,存根有点笨拙,但可以做到。

allow(Database::MyTable).to(
 receive(:active).and_return(double(
   where: [{ id: 1 }, { id: 2 }] 
 ))
)

我们已存根 active 以返回我们存根 where 的模拟(double)。

文档:rspec-mocks

PS:还有很多其他方法可以编写这些存根,有些客观上更好,有些主观上更好。还有一些方法可以重构您的代码以使存根更容易。

PPS:欢迎使用 ruby​​!

【讨论】:

  • 这行得通!现在我知道double 来模拟数据。另外,我找到了 factory_bot,在这两个解决方案之间我有一个非常整洁的测试。
  • 是的,我们在所有 Rails 项目中都使用factory_bot。听起来你已经有了一个好的开始:)
【解决方案2】:

我会将检索数据的代码(包括您提到的那一行)分离到一个方法中,将使用/操作数据的代码分离到另一个方法中,然后模拟整个检索方法。这样您就不需要对所使用的确切查询感到困惑。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多