我正在使用Rails 3.1和Backbone.js编写一个(几乎-)单页应用程序。因此,我的大多数控制器返回无根JSON,按照Backbone.js文档提供此设置:
ActiveRecord::Base.include_root_in_json = false例如,返回的帐户JSON如下所示:
{
"created_at":"2011-12-27T22:23:17Z",
"id":1,"name":"My Happy Account",
"updated_at":"2011-12-27T22:23:17Z"
}我正在测试这种方法的工作方式如下:
it 'returns the account associated with the current user' do
get :current, :format => :json
assert_response(:success)
account = JSON.parse(response.body)
account['name'].should == @account_one.name
account['id'].should == @account_one.id
end规范通过了,但我禁不住觉得它有点恶心,也许不太地道。有人能给我一个更好的方法吗?
发布于 2012-01-05 00:17:09
我的应用程序也是一个单页主干/Rails 3.1应用程序,我的测试与您的类似。我的测试更详细一些--我的目标通常是每个it / specify块中的一个断言--但是测试的实质是相同的:发出请求、解析响应,并根据响应包含的内容和我预期的应该包含的内容进行断言。
这里要问自己的关键问题是,在一个更传统的、多页的、非主干的应用程序中,惯用的控制器测试会是什么样子。在这些测试中,您通常会检查一些内容:
对于第1项,我认为这相当于解析响应并寻找特定值。RSpec给您提供了assigns语句的优点,它使事情看起来更清晰一些,但在我看来,它的意图与您所做的是一样的。如果需要,您可以很容易地编写自己的糖来包装解析的JSON响应体,因此可以编写类似于json_response(:name).should == @account_one.name的东西,其中json_response是要编写的助手方法的名称。(这个实现基本上相当于解析响应体并查找作为方法参数传递的键的值。)这样做,测试看起来更像那些非骨干应用程序。
第2项不适用于单页主干应用程序,因为您总是在同一个页面上。所以这就完了。
第3项与非主干应用程序相同。你有assert_response(:success),这很好。我喜欢做一些像response.status.should eq(200)这样的事情,或者对我期望的状态代码做任何合适的事情。我发现在我的主干网应用程序的测试中,我检查状态代码比在一个更“传统”的多页应用程序中更频繁,这仅仅是因为我喜欢在可能的情况下返回适当的HTTP状态代码作为Ajax应用程序中的错误响应,而在一个多页应用程序中,我可能会返回200状态,页面上有一些错误信息,比如“电子邮件地址是强制性的”。YMMV,在这方面。
https://codereview.stackexchange.com/questions/7287
复制相似问题