ruby의 RSpec
RSpec : 테스트 코드를 작성하기 위한 테스트 프레임워크.
before : 각각의 테스트가 실행되기 전에 공통적으로 숳애해야 하는 설정 또는 준비 작업을 정의하는데에 사용된다.
before 블록이 실패하는 경우, 일반적으로 다음과 같은 시나리오가 발생합니다:
- before 블록 내에서 예외가 발생하면, 해당 테스트 케이스는 실행되지 않고 예외가 발생한 것으로 표시됩니다.
- before 블록 내에서 특정 조건을 충족하지 않으면, 해당 테스트 케이스는 실행되지 않고 실패한 것으로 표시됩니다.
RSpec.describe MyObject do
before do
# 실패하는 설정 작업
raise "Error in before block"
end
it "does something" do
# 이 부분은 실행되지 않음
end
end
be_falsey : RSpec 기대 표현식 중 하나로 어떤 값이 거짓이라고 기대할 때 사용한다. 해당 값이 false 또는 nil일 경우에 테스트를 통과시킨다.
RSpec.describe MyObject do
it "returns false" do
result = false
expect(result).to be_falsey
end
it "returns nil" do
result = nil
expect(result).to be_falsey
end
end
expect : 주로 코드의 출력, 반환 값, 예외 발생 등과 관련하여 기대값을 설정하고 이를 검증하는 역할을 수행한다. expect 메서드의 반환 객체는 Matchers(매처)라고 불리는 다양한 메서드를 지원하여 테스트의 기대값을 표현하고 비교할 수 있게 한다. Matchers는 RSpec의 주요 기능 중 하나이다.
RSpec.describe Calculator do
it "adds two numbers" do
calculator = Calculator.new
result = calculator.add(2, 3)
expect(result).to eq(5) # Matchers인 eq 메서드를 호출하여 검증. to는 해당 검증이 성공해야 한다는 것을 의미함.
end
end
Factory Bot : 테스트 데이터를 생성하기 위한 라이브러리. Factory Bot을 사용하면 테스트 시나리오에서 필요한 객체를 간편하게 생성할 수 있습니다.
# spec/factories/user.rb
# 팩토리 파일
FactoryBot.define do
factory :user do
name { "John Doe" }
email { "john.doe@example.com" }
age { 30 }
end
end
위의 예시에서 user 팩토리는 name, email, age와 같은 속성을 가진 User 객체를 생성합니다.
이제 테스트 코드에서 해당 팩토리를 사용하여 객체를 생성할 수 있습니다:
# spec/models/user_spec.rb
RSpec.describe User do
it "has a valid factory" do
user = FactoryBot.create(:user)
expect(user).to be_valid
end
end
위의 예시에서 FactoryBot.create(:user)를 사용하여 user 팩토리를 통해 User 객체를 생성합니다.
let : 테스트 코드에서 재사용 가능한 변수를 정의하기 위해 사용됩니다.
RSpec.describe Calculator do
let(:calculator) { Calculator.new }
it "adds two numbers" do
result = calculator.add(2, 3)
expect(result).to eq(5)
end
it "subtracts two numbers" do
result = calculator.subtract(5, 2)
expect(result).to eq(3)
end
end
위의 예시에서 let(:calculator)은 Calculator 객체를 생성하는 데 사용되는 변수를 정의합니다. let은 지연 평가되므로, calculator 변수의 값을 처음으로 참조할 때까지 Calculator.new가 호출되지 않습니다. 이후에는 calculator 변수를 여러 곳에서 참조하여 객체를 사용할 수 있습니다.
let은 각 테스트 케이스마다 한 번만 계산됩니다. 따라서 calculator 변수는 각 테스트 케이스에서 독립적으로 동작하며, 테스트 코드 사이에서 상태를 공유하지 않습니다.