0

我正在尝试为 API 编写 RSpec 测试。

设置: 为了保持一致,我们有一个格式化函数,它接受响应并生成一个漂亮的 JSON 对象,所以一切都是一致的。例如-为本示例简化:

def format (status, message)
  {status: status,
   message: message}
end

此函数在所有 API 控制器继承的基本控制器中声明。

我想要什么: 当我测试 API 控制器时,我想测试控制器是否给了我预期的结果,但我不想测试 JSON 响应的实际格式。如中,我想检查传递给格式函数的参数是否符合我的预期,但我不想检查该函数实际返回的内容。(我计划在另一个测试中测试该功能。如果对 JSON 格式的更改不会影响 API 的每个测试,我会非常喜欢它。如果这不是好的做法,请随时告诉我。 )

我的问题: 有什么方法可以让我从当前 API 规范文件中的基本控制器访问该格式函数?或者有什么好方法让我把它存根并访问传递给它的参数,这样我就可以检查它们是否正确?

相关:如何使用 RSpec 检查 JSON 响应?

4

1 回答 1

1

听起来你正试图在你的控制器规范中做这样的事情:

let(:status) { function1(params_hash) }
let(:message { function2(params_hash) }
it "does something something" do
  model.should_receive(:format).with(status, message)
  get :action, params_hash
 end

定义如何从 params_hash 计算状态和消息由您决定。我所做的是思考各种路径是什么,并为每个路径编写一个测试。如:

context "when id is missing in the params" do
 let(:status) { 404 }
 let(:message) { "Not found" }
 let(:params_hash) { {:id => nil} }

context "when id is correct" do
  let(:status) { 200 }
  let(:message) { "OK" }
  let(:params{hash) { {:id => 1 } }
于 2013-03-13T21:54:17.650 回答