使用Rspec测试将Ruby对象转换为json对象

时间:2019-03-06 18:10:41

标签: ruby-on-rails testing rspec

我有一个具有四个属性的对象;

Object
attr1, attr2, attr3, attr4

出于数据科学的原因,我需要将此信息发送到另一个应用程序。我创建一个执行映射的方法:

def convert_for_elastic_search
    {
        name_attr1: @object.attr1,
        name_attr2: @object.attr2,
        name_attr3: @object.attr3
    }
end

如何使用RSpec测试此方法?我不能嘲笑,也不想对值进行硬编码,因为它们来自Factory Bot。

哪种方法更好?

1 个答案:

答案 0 :(得分:0)

最好是以某种方式获得对@object的引用。如果是使用create()调用创建的,则可以覆盖工厂的属性。

如果不能直接设置值,则可以创建期望来验证“映射”值与源值匹配。

object { FactoryBot.create(:object) }
subject { FactoryBot.create(:mapper, object: object) }
result = subject.convert_for_elastic_search
expect(result[:name_attr1]).to eq object.attr1
expect(result[:name_attr2]).to eq object.attr2
expect(result[:name_attr3]).to eq object.attr3

当然,如果您要按上面所示设置规格,那么设置硬编码值将很简单。即FactoryBot.create(:object, attr1: 'val1')。在这种情况下,您只能期待'val1'。

如果无法如上所示访问object,那么您将需要一种对其进行引用的方法,也许映射器(主题)以某种方式公开了这一点。

如果您确实无法达到@object,那么也许只需测试该值是否存在以及正确的数据类型就足以验证映射过程。