gpt4 book ai didi

ruby-on-rails - 在 Ruby 中协调类契约

转载 作者:行者123 更新时间:2023-11-28 20:46:10 25 4
gpt4 key购买 nike

我的应用程序的核心是一个引擎,它采用问题规范,编码为数据结构,并生成我们需要的结果。有两种方法可以实例化规范数据结构:通过解析脚本或通过 Rails UI。在 Rails 的情况下,数据结构是数据库中的模型对象,在脚本的情况下,它是模型类的内存实例。该引擎位于一个单独的 gem 中,因此脚本驱动的过程可以独立运行而无需 Rails。

我的问题是如何确保 Rails 数据库模型和内存模型这两种数据结构履行相同的契约。如果这是 Java,我会编写一个接口(interface),两个模型类都将实现,但在 Ruby 中,我依赖于鸭子类型。我将对每个模型进行测试,但只有一个测试套件会更干。但是,我看不到如何在 gem 项目和 rails 项目之间共享测试。

关键的挑战是:假设我向 Rails 模型添加了一个责任,我如何保证相应的责任被添加到脚本内存模型中,反之亦然?

最佳答案

我想您应该创建一个模块,其职责是检查接收器类是否包含所需的方法。

像这样:

module Contract
STATIC_METHODS = [ :class_foo ]
INSTANCE_METHODS = [ :instance_foo ]

def self.included(receiver)
STATIC_METHODS.each do |method|
raise("missing class method #{method}") unless receiver.respond_to? method
end
INSTANCE_METHODS.each do |method|
raise("missing instance method #{method}") unless receiver.instance_methods.include? method.to_s
end
end
end

class YourClass
def self.class_foo
end

def instance_foo

end

include Contract
end

注意在文件末尾包含 Contract,否则逻辑上会失败(不会定义方法)。

关于您的测试,您应该创建一些通用测试并在您的类中运行它们,例如:it_should_behave_like

关于ruby-on-rails - 在 Ruby 中协调类契约,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9225987/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com