【问题标题】:Best way to test DELETE requests with Rspec?使用 Rspec 测试 DELETE 请求的最佳方法?
【发布时间】:2014-10-12 00:44:38
【问题描述】:

我开始使用这种方式:

  describe "DELETE /v1/categories/{id}" do
   before(:each) do
     #   Login User/Token
   end
   it 'deletes a category' do
     category = Fabricate(:category)
     category2 = Fabricate(:category)

     get "/v1/categories"
     expect(response.status).to eq 200
     expect(JSON.parse(response.body)).to eq([YAML.load(category.to_json),YAML.load(category2.to_json),])

     delete "/v1/categories/#{category.id}"
     expect(response.status).to eq 200

     get "/v1/categories"
     expect(JSON.parse(response.body)).to eq([YAML.load(category2.to_json)])
   end
 end

我不确定是否是测试删除数据的 API 请求的最佳方法。

【问题讨论】:

    标签: ruby-on-rails api rspec request http-delete


    【解决方案1】:

    到目前为止,您的测试确保了这一点:

    • 删除前获取请求的响应
    • get 请求的状态码
    • 删除请求的响应
    • 删除请求的状态码
    • 删除后get请求的响应
    • get 请求的状态码

    这个测试覆盖的内容比删除请求要多,但我认为这很好。有这种测试总比没有测试好。

    为了改进这个测试,我会做的是在测试时拆分路线。 我将进行 1 次测试以确保索引路由按预期工作并且 1 次测试以确保删除路由正常工作。这样索引路由上的错误不会破坏您的删除规范。 =)

    我会有这样的东西:

    describe "GET /v1/categories" do
        before(:each) do
            #   Login User/Token
            category = Fabricate(:category)
            category2 = Fabricate(:category)
            get "/v1/categories"
        end
    
        it 'should return status 200' do
            expect(response.status).to eq 200
        end
    
        it 'list all categories' do
            expect(JSON.parse(response.body)).to eq([YAML.load(category.to_json),YAML.load(category2.to_json),])
        end
    end
    
    describe "DELETE /v1/categories/:category_id" do
        before(:each) do
            #   Login User/Token
            category = Fabricate(:category)
            category2 = Fabricate(:category)
            delete "/v1/categories/#{category.id}"
        end
    
        it 'should return status 200' do
            expect(response.status).to eq 200
        end
    
        it 'should delete the category' do
            expect(Category.all).to eq category2
        end
    end
    

    【讨论】:

    • 我已经对所有 URL 和方法进行了所有测试。我的问题是我只需要测试删除请求,而不是检查数据库中是否存在对象?或者我可以使用我的方式进行测试,在数据库上创建两个类别,删除一个并列出所有类别以检查删除的一个是否在数组上。检查此链接:github.com/larica/larica-api/blob/…
    • 两种方法都可以。 =)
    • 这只是口味问题。如果可以的话,我不喜欢在同一规格中混合所有路线,但正如我所说,这只是我的意见。你的方法很好!
    • 很好,我喜欢你做的删除测试。我只是有这个问题,我知道我创建了很多代码,但是如果我能看到其他方法,我不确定该方法是否正确。如果我们可以使用“单元测试”理念编写代码,也许我只需要检查Category.find(category.id) 是否返回错误。类似的东西。这是我希望得到更多反馈的事情。
    • 我认为您的回答看起来不错。我只是需要更多的观点。我没有为此找到“风格指南”。多谢,伙计! o/
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-15
    • 1970-01-01
    • 2016-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-27
    相关资源
    最近更新 更多