如何用 Rspec 测试 DELETE 请求是最佳方式?

7
我开始使用这种方式:

我开始使用这种方式:

  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请求以删除数据的最佳方法。

1个回答

7
到目前为止,你的测试确保了以下内容:
  • 删除之前get请求的响应
  • 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和方法编写了测试。我的问题是,我只需要测试删除请求,然后检查对象是否存在于数据库中?还是我可以使用我的方法,在数据库中创建两个类别,删除一个并列出所有类别以检查删除的类别是否在数组中。请查看此链接:https://github.com/larica/larica-api/blob/342ca6ff4a6f69651c814515a7be950afb8a47b0/spec/api/v1_categories_spec.rb - Ivan Santos
两种方法都可以。=) - Paulo Henrique
这只是个人喜好问题。如果可能,我不喜欢在同一个规格中混合所有路由,但正如我所说,这只是我的意见。你的方式很好! - Paulo Henrique
很好,我喜欢你做的删除测试。我只有一个问题,我知道我写了很多代码,但如果我能看到其他方法,我不确定这种方式是否正确。如果我们可以使用“单元测试”哲学编写代码,也许我只需要检查Category.find(category.id)是否返回错误。就像那样。这是我想要更多反馈的事情。 - Ivan Santos
1
我认为你的答案看起来不错。我只需要更多关于那个问题的观点。我没有找到相关的“样式指南”。谢谢老兄!o/ - Ivan Santos
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接