有关设置Guard-RSpec示例项目的问题

时间:2016-06-05 22:46:22

标签: ruby rspec guard

我正在尝试使用guard-rspec设置一个有效的ruby项目。

我将tutsplus tutorial的一般方法与RSpec videosanother post中描述的一些新语法混合在一起。该项目可在github上的stack-overflow-question分支中找到。

我也在尝试按照Programming Ruby 1.9中的描述练习命名空间。所以我最终希望example.rb目录中有lib/example/

我对我的项目有4个问题:

  1. 我需要在Guardfile中查看我的项目中的特定目录以进行更改?我有几种不同的方式可以在我的Guardfile中看到标记为:
  2. 的评论

    # Watch Specific Directory Attempt X

    1. 在我的Guardfile(下方Uncomment and set this to only include directories you want to watch)中取消注释第8行和第9行,并按照here添加watch(%r{^lib/(?<path>.+)\.rb$}) { |m| "spec/lib/#{m[:path]}_spec.rb" }之类的“命名群组捕获”之间有什么区别}

    2. 我需要在哪里放置--clear选项才能使其持久化?我知道我可以使用像bin/guard --clear这样的binstub来运行它,我已经尝试将它放在我的Guardfile中,但它不起作用。

    3. 您在我的项目中看到了明显的约定,语法或清晰度错误吗?我觉得我正在把这整件事整理在一起,我很欣赏一些以明智的方式将这件事拼凑在一起的指导。

1 个答案:

答案 0 :(得分:1)

我会回答标题中的问题,并在我去的时候涵盖“子问题”。

  1. 设置项目的最佳方式(截至目前)是使用bundle exec guard --init rspec。这应该给出合理的默认值来立即开始工作。它并不完美,但是有很多工作要改进,所以请在GitHub上提问(更有意义)。

  2. Guard必须保持向后兼容性,所以现在有一些“非直观”的东西,首先浏览所有文档(和wiki)是一个很好的投资,可以快速了解可用的内容和位置。在困惑或疑问时询问也是一个好主意(每个问题最好一个问题)。

  3. Guard使用DSL来简化设置侦听器。这有点不直观和笨拙有时,但它确实有助于将操作组织到组中,这有助于维护复杂的工作流程。 DSL的命令,例如clearing终端自动为:(clearing: on)。 (这回答问题3)。

  4. 有各种各样的用途和场景,因此Guard努力让每个人都感到高兴,并且也在每个平台上。 Guard使用Listen,它以递归方式监视目录(主要是由于对OSX的限制)。这通常不是问题,但对于OSX的巨大方向,这可能非常非常慢。这就是为什么Guard允许您选择要观看的顶级目录(如'lib','app'等)。看整个项目目录非常方便,所以这仍然是默认的。有关这方面的更多信息,请访问Listen项目。因此,默认情况下,所有目录(:directories语句)都是“物理监视”(占用操作资源),但在Guard中,您只需配置要响应的更改(watch语句执行的操作)

  5. 所选词语有时会有点误导。例如。 DSL中的watch实际上意味着:“在所有发生的变化中,选择匹配的变化......”。传递给watch的块将获得匹配结果。该块应返回要运行的当前guard插件的文件列表。因此,“观察”可能更具误导性而非有用。 “匹配”可能是一个更好的选择,它可能在未来取代“观察”。

  6. guard-rspec项目在更改的文件上运行RSpec。如果您在启用调试选项的情况下运行guard,则可以看到确切的RSpec命令,例如: bundle exec guard -d。为了简化设置,如果项目遵循给定的设置,Guard :: RSpec使用的DSL应该是开箱即用的。例如。 dsl.watch_spec_files_for(ruby.lib_files)已定义为here:因此,如果将所有经过测试的源文件放在lib中,它几乎已经应该按照您的要求执行。对于其他文件夹,您可以添加自己的文件夹。例如。 Rails项目通常也在app目录中有源,因此在默认的Guard :: RSpec模板中有一个语句:dsl.watch_spec_files_for(rails.app_files),模式定义为:rails.app_files = %r{^app/(.+)\.rb$}如果你有一个典型的案例没有涵盖,在该项目中打开一个问题。 (涵盖问题2)。

  7. 示例项目中的一切看起来都很好,建议主要基于品味或偏好。 E.g。

    • 而不是let (:greeter) { Example::RSpecGreeter.new },我会使用RSpec的隐式subject(但有些人可能会认为它不那么明确且不太可读)。
    • 如果您正在测试Example::RSpecGreeter,我建议您将该类放在单独的文件中并改为包含它(require 'example/rspec_greeter'
    • 您可以添加RubCop / Guard::RuboCop来检测常规问题(涵盖第4个问题)
    • 您可能希望查看Guard自己的Guardfile,用于测试自己的“真实”设置,而不会出现文档混乱。
    • 为了获得最佳效果我认为最好复制整个现有项目并重命名要更改的部分。通常还有很多时间用于微调Travis的备用RSpec配置,特殊的宝石发布任务,某些变通方法和便利等等。