0

我创建了一个服务对象(http://railscasts.com/episodes/398-service-objects),它基本上创建了两个模型,A 和 B,在 B 属于 A 的位置建立它们之间的关联,并返回 A(其中反过来,您可以通过 A 访问 B 给定的关联)。

出错时,我返回一个带有错误信息的哈希。当我尝试测试此方法时,我现在遇到了一个问题,其中有两种可能的返回类型:模型(当它通过时)或带有错误信息的哈希。

这是设计错误的信号吗?我知道当您首先测试 (TDD) 时,您会避免此类设计问题。

如果这是一个问题,那么我知道我需要返回一个无效的 A 模型。假设模型 B 在创建时抛出错误,我如何仍然能够返回无效的 A 模型?

如果返回错误哈希是可以的,我还能如何设计这个方法来测试友好?

4

2 回答 2

1

很好的洞察力和很好的问题。:-) 从表面上看,这似乎是为“错误”情况引发 Ruby 异常而不是作为方法调用的结果作为哈希返回的好情况。您可以定义自己的错误类(可能应该是 的子类StandardError)并将散列或您想要的任何信息作为您引发的错误的一部分。有关此一般主题的讨论,请参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_exceptions.html

至于检查 rspec 中的错误是否引发,请参阅How to use RSpec's should_raise with any kind of exception? 的最后一个答案?,包括附加信息的链接。

如果您想将您的 API 呈现为 RESTful 接口,共识似乎是利用 HTTP 响应代码来呈现异常,如如何处理 REST 异常?如果您确实使用异常响应代码(例如 40X)来呈现您的异常,那么您在这种情况下返回一个哈希值而在另一种情况下返回一个模型并不是什么难闻的气味,恕我直言,因为没有一致性的期望在伴随错误的数据和伴随成功返回的数据之间。无论如何,我认为在错误情况下返回“无效”模型没有任何意义,假设您实际上并没有在这种情况下创建/保留模型。

于 2013-07-16T01:39:43.597 回答
0

您可以测试结果的类型。

在 rspec...

expect(actual).to be_an_instance_of(expected)
expect(actual).to be_a_kind_of(expected)
于 2013-07-16T00:11:11.947 回答