【问题标题】:How do I assert that a model has a readable/writable attribute?如何断言模型具有可读/可写属性?
【发布时间】:2010-04-20 00:08:02
【问题描述】:

在我的一个模型中,我使用一些元编程来动态定义一些方法。我想测试一下;因此,我需要一种紧凑的方法来断言我的模型具有具有特定名称的可读/可写属性。想法?

如果有什么不同,我会使用 shoulda 进行单元测试。

【问题讨论】:

    标签: ruby-on-rails ruby unit-testing metaprogramming shoulda


    【解决方案1】:

    你也许可以使用 should_have_instance_methods 或 should_have_class_methods shoulda 宏 - 我没有尝试过这个用例,它们可能依赖于您的对象具有 ActiveRecord::Base 的超类

    respond_to 呢?

    o = some_dynamic_object()
    assert(o.respond_to?(:method_x)) # getter
    assert(o.respond_to?("method_x=".to_sym) # setter
    

    【讨论】:

    • should_have_xxx 方法 do 依赖于 ActiveRecord::Base 的子类化。但是您回答的 response_to 部分非常简洁。接受。
    • 应该有一个方便的方法:"assert_respond_to instance, sym"
    【解决方案2】:

    有几种方法,具体取决于它的定义方式。如果您正常定义它(以某种方式在evalclass_eval 中定义defdefine_method),那么您可以使用defined? obj.prop 来确保它响应读者(作家没有等价物)。您也可以使用obj.respond_to? :prop 作为读者,obj.respond_to? :prop= 作为作者。

    如果您使用method_missing 来模拟对该属性的调用,那么obj.respond_to? 仅在您重新定义它时才有效(在这种情况下您需要单独测试它),并且是唯一的测试方法您的属性是尝试从中读取和写入,并断言它不会引发任何异常。

    【讨论】:

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