1

我正在编写一个规范来测试一种down_vote方法。但为了测试这一点,我需要在数据库中为现有投票输入一个条目。所以我的规范看起来像这样:

describe "down_vote" do
  it "lowers vote count" do
    video = Factory.create(:video)
    user = Factory.create(:user)
    vote = Factory.vote(:vote, :voter_id => user.id, :voteable_id => video.id)

    expect do
      user.down_vote(video)
    end.to change{ Vote.count }.by 1
  end
end

可以编写这样的规范/测试吗?似乎有很多我不太习惯的设置,但我真的不知道有什么其他方法可以测试它。

4

2 回答 2

1

我会做:

let(:video) { Factory.create(:video) }
let(:user)  { Factory.create(:user)}
let(:vote)  { Factory.vote(:vote, :voter_id => user.id, :voteable_id => video.id)}
describe "down_vote" do
  it "lowers vote count" do
    vote # or use let! To have the vote created directly
    expect do
      user.down_vote(video)
    end.to change{ Vote.count }.by 1
  end
end

超出let您的规格使其可重复使用

于 2012-06-03T09:37:18.260 回答
0

假设您的规范按预期工作,只要不违反 DRY 原则,在单个测试块中使用工厂就没有错。如果许多测试要引用相同的对象,那么您可能希望使用 RSpec letbefore块来实例化您的工厂对象。

您可能还想阅读有关“使用工厂”和“关联”的factory_girl 文档部分,以查看您的特定测试是否可以:

  1. 使用#build 而不是#create 来避免写入数据库,并且
  2. 利用#association 以便您的工厂可以隐式构建/创建关联记录。

根据经验,可以在相关测试块内执行特定于测试的设置。重要的是要避免以手动和容易出错的方式重复设置相同的数据。

于 2012-06-03T12:35:06.193 回答