2

FactoryGirl을 사용하여 모델의 메모리 스텁을 작성한 다음 모든 ActiveRecord 쿼리 만 모델에 대해 실행하도록합니다. 예 :RSpec 테스트에서 데이터베이스 사용을 완전히 피하는 방법은 무엇입니까?

# Assume we start with an empty database, a Foo model, 
# and a Foo factory definition. 

#foo_spec.rb 
stubbed_foo = FactoryGirl.build_stubbed(:foo) 

# Elsewhere, deep in the guts of application 
Foo.first() # Ideally would return the stubbed_foo we created 
      # in the test. Currently this returns nil. 

해결 방법은 메모리 내장 데이터베이스를 사용하는 것일 수 있습니다. 그러나 위의 시나리오가 가능합니까?

+0

테이블이 없으면 모델을 따르는 스키마가 없으므로 스터브 된 모델은 실제 스키마와 일치하지 않아도 모든 개체처럼 작동 할 수 있습니다. 생산에 존재할 것이다. 이것은 아마도 나쁜 생각 일 것입니다. 이런 식으로 ActiveRecord를 우회하는 이유는 무엇입니까? –

+0

공장 소녀 대신 조명기를 사용할 수 있습니다 – trueinViso

+0

@trueinViso Foo 클래스가'first()'또는 다른 쿼리 메서드를 호출 할 때 여전히 데이터베이스로 이동하므로 픽스처가 문제를 해결할 것이라고 생각하지 않습니다. –

답변

0

데이터베이스를 피하는 이유는 테스트 속도를 높이는 것이 더 나은 방법입니다.

가능한 한 create 대신 FactoryGirl.build을 사용하십시오. 이 코드는 레코드가 데이터베이스에서 가져 오지 않는 한 작동합니다. 이것은 잘 구조화 된 코드로 단위 테스트를하는 경우에 효과적입니다. (예를 들어,이 Service Objects를 사용하여 장치가 독립적으로 테스트하는 데 도움이됩니다. 실제로, 당신은 FactoryGirl.create를 사용하여 트랜잭션 설비를 사용할 수있다) 당신의 Foo.first 예를 들어 호출로 (데이터베이스에서 읽을 필요가 테스트를 위해

.이 만드는 다음 데이터베이스 각각의 테스트 예제의 시작 부분에 거래하고,이 예제의 끝에있는 트랜잭션을 롤백합니다. 이것은 당신이 그런 after_commit로 액티브 모델에서 콜백을 사용할 때 문제가 발생할 수 있습니다.

당신이 after_commit 또는 다른 콜백을 사용하는 경우 모델에서 데이터베이스 트랜잭션을 닫아야하거나 코드에서 명시 적 트랜잭션을 사용하는 경우에는 DatabaseCleaner을 설정하는 것이 좋습니다. https://gist.github.com/RobinDaugherty/9f4e5f782d9fdbe191a23de30ad8b539

+0

예, 제 동기는 테스트 스위트를 신속하게 유지하는 것입니다. 가능한 한'FactoryGirl.build'와'FactoryGirl.build_stubbed'를 사용하고 있습니다 만, 전적으로 데이터베이스 의존성을 제거 할 방법을 찾고있었습니다. 나는 트랜잭션 픽스쳐가 내가 원하는 것을 성취 할 것이라고 생각하지 않는다. 이것은 조기에 최적화 된 부분 일지 모르지만 데이터베이스 상호 작용으로 테스트를 작성하기 전에 가능하지 않았는지 확인하고 싶었습니다. –

+0

'FactoryGirl.build'에서 스텁 사용에 이르는 속도가 상당히 빨라지는지 의심 스럽습니다. 하지만 모델 팩토리를 사용하면 모델 동작이 올바른지 확인하기 때문에 테스트에서 품질이 떨어질 것입니다. 나는 그것을 추천하지 않을 것이다. –