2017-03-09 46 views
1
describe "Team::Membership" do 
    let(:team) { Team.last } 
    let(:user) { User.last } 
    let(:membership) {user.apply_for(team)} 

    it "can be rejected" do 
    assert_difference "team.denied_applications.reload.count", +1 do 
     assert_difference "team.applications.reload.count", -1 do 
     assert_difference "team.members.reload.count", 0 do 
      membership.reject! 
     end 
     end 
    end 
    membership.state.must_equal "denied" 
    end 

如果申请被拒绝,则范围denied_applications增加1,applications为-1,members根本不会改变。这是一个很好的书面测试还是很难看?

# team.rb 
    has_many :memberships, dependent: :destroy 
    has_many :members, -> { where(team_memberships: {state: :confirmed}) }, through: :memberships, source: :user 
    has_many :ex_members, -> { where(team_memberships: {state: :left}) }, through: :memberships, source: :user 
    has_many :applications, -> { where(state: :pending) }, class_name: "Membership" 
    has_many :denied_applications, -> { where(state: :denied) }, class_name: "Membership" 

所以我的问题是更可能:是一个很好的软件写测试或者你只是写

team.denied_applications.reload.count.must_equal(1) 
team.applications.reload.count.must_equal(0) 
team.members.reload.count.must_equal(0) 

回答

0

有些人会认为,差异断言应该在不同的测试,但恕我直言在这种情况下,这不是问题。

什么是不是在我心中最佳的,是你打电话

let(:team) { Team.last } 
let(:user) { User.last } 

要确保你的测试不依赖于或相互干扰,数据库应测试运行之间进行清洗,所以如果做到这一点,你会写这样的:

let(:team) { Team.create } 
let(:user) { User.create } 

,或者您可以使用类似factory_girl更轻松地创建的记录,例如,如果你有一些验证怎么回事,不想打字了有效数据到处。

+0

我确实使用factory_girl'Team.last'indeed来自seeds.rb。整个项目很大,我们需要种子进行测试。用户创建一个团队。团队创建各种项目,该团队的一些用户可以对项目进行一些操作。我觉得用factorygirl运行所有这些东西并不现实,因为obv。团队首先需要批准,项目需要批准。所以只需运行1个测试小测试,然后我需要运行至少20行的ruby代码,只是为了测试场景 –

+0

我绝对看到你来自哪里。也许'factory_girl'特征可以帮助你,所以你可以有某种'创建(:团队,:批准)'左右? – jfornoff