2011-05-05 3 views
5

어쩌면 이것은 테스트해야 할 것이 아니지만 학습 중이므로 최대 값을 테스트하는 것이 좋지 않을 것이라고 생각합니다.질량 할당에 대한 테스트

나는 하나를 제외하고 모두 예상되는 결과를 산출하는 몇 가지 테스트를 거쳤습니다. 나는 그 문제를 해결하기위한 방법을 찾았지만 올바른 방법이 무엇인지 궁금해했습니다.

레일즈 콘솔에 저장을 테스트 할 때 params 해시의 admin 필드를 저장하지 않습니다. 이는 예상 한 것입니다. 공장으로 구축하고 저장하면 유효성 검사가 그에 따라 통과/실패합니다. 대량 할당에 대한 테스트를 수행 할 때 테스트가 실패합니다 (예상하지 못했을 때 관리자 필드를 설정하기 때문에)

어떤 생각, 제안 또는 우려 사항이 있습니까?

감사

모델 :

class User ... 
    #id, name, email, admin(int) 
    attr_accesible :name, email 
    ... 
end 

user_spec

it "should not have an admin after a mass save" do 
    user = Factory.build(:user) 
    user.save 
    user.admin.should be_nil #its not nil, its 0  
end 

공장

Factory.define :user do |f| 
    f.name "rec_acro" 
    f.email "[email protected]" 
    f.admin 0 
end 

답변

13

당신은 간결한 대량 a를 얻을 수 RSpec에 위에 Shoulda을 사용할 수 있습니다 ssignment 사양 :

describe User do 
    it { should_not allow_mass_assignment_of(:admin) } 
end 
+0

당신은 진작을 사용 RSpec에를 사용할 필요가 없습니다 : 그것은 기본적으로 같은 작업을 수행합니다. –

+5

맞아요,하지만 OP가 이미 rspec을 사용하고 있기 때문에 함께 사용할 수 있다는 사실을 지적하고있었습니다. –

+1

그러면이 질문과 답변을 읽고 도움을 구하는 사람 만 OP가 될 것이라고 생각하십니까? 나는 다른 사람들을 위해 그것을 지적했다. –

2

공장 소녀 (정의로운 그래서) 객체를 생성하는 대량 할당을 사용하지 않습니다. 팩토리에서 생성 된 사용자 객체를 가져 와서 admin 매개 변수 만 사용하더라도 대량 할당을 시도합니다.

3

FactoryGirl은 공장 정의에서 각 속성을 가져 와서 개별적으로 설정합니다. 그래서 테스트는 실제로 FactoryGirl 코드 (build.rb)에서 대량 할당

을 테스트하지 않습니다 : (. 당신이 FactoryGirl 보석에 대한 읽기 더 많은 코드에 관심이 있다면 this 참조)

def set(attribute, value) 
    @instance.send(:"#{attribute}=", value) 
    end 

또 다른 대답이 제시되었으므로, should should를 사용하여 allow_mass_assignment_of 정규 표현식을 사용할 수 있습니다. (매처 (matcher)에 대해해야 하는가에 대해 Here's a little 더.)

it "allows mass assignment of :title" do 
    accessible = Post.accessible_attributes.include?('title') || 
      !Post.protected_attributes.include?('title') 
    accessible.should be_true 
end 

관련 문제