Mongoid强制只读模式

时间:2019-06-27 15:02:33

标签: rspec mongoid rspec-rails rspec3 mongoid7

我有一个特定的用例,我需要向一些客户发送测试电子邮件(即,他们可以提前知道我们所有电子邮件的外观,并且他们可以与内部IT系统进行核对,以确保不会出现黑名单)。

为了实现此目的,这是一种非常有效的方法,我在重用我现有的工厂,以便可以轻松生成发送到邮件的测试数据,并在发送每封电子邮件之前,覆盖to / cc字段以添加测试电子邮件,并在主题中添加[test]作为前缀

我想编写一个测试来确保没有数据写入数据库(即,仅使用build语句以良好的方式使用了我的工厂,尤其是在处理嵌套关联构建时) / p>

我需要编写一个规范,以确保DB不会收到任何写查询(或实际上根本没有任何查询)。我的“测试代码”是安全的,并且不会在工厂的生产数据库中创建数据。

到目前为止,我还没有找到一种方法来执行此操作,因此,我添加了一些对所有集合进行迭代的代码,然后运行了此代码

tested_models.each do |model|
  expect(model.count).to eq(0), "#{model.name} was persisted"
end

但是我需要手动更新此tested_models,因此无法正常工作。我正在寻找更好的解决方案。我的提示

  • 也许找到一种方法来强制mongoid适配器使用“只读”模式,或者创建一个只读用户,所以我会看到类似Mongo::Error::OperationFailure: not authorized on myapp_test to execute command { insert: "messages", $db:的消息
  • 将负责处理数据库查询的Mongoid核心方法之一cf this question和发出opened in Rspec

1 个答案:

答案 0 :(得分:0)

要验证应用程序未发送任何更新,可以在驱动程序(https://docs.mongodb.com/ruby-driver/master/tutorials/ruby-driver-monitoring/#command-monitoring)中使用命令监视,并检查记录的命令。

要禁止更新集合,您可以在MongoDB(https://docs.mongodb.com/manual/tutorial/manage-users-and-roles/)中设置角色。