사각형

5450 단어 railsruby
밥: 테스트가 너무 오래 걸려요!

Steve: 왜 그렇게 오래 걸립니까?

Bob: 내 레코드를 만들고 데이터베이스에 저장하는 데 시간이 오래 걸립니다!

Steve: 왜 당신의 기록이 계속해서 테스트 실행에 그렇게 많은 영향을 미치나요?

Bob: 내 논리가 데이터베이스에서 데이터를 가져와서 저장하고 있고 테스트해야 하기 때문입니다.

Steve: 논리가 데이터베이스에서 끌어오고 저장하는 이유는 무엇입니까?

Bob: uhhh... 그게 내가 Rails를 작성하는 방법을 배웠기 때문인가요? Hexagonal에 대해 나에게 강의하려는 것이 아닙니까?

Steve: 아니오, 하지만 사람들이 일반적으로 Rails를 작성하는 방식으로 빠른 테스트 스위트를 본 적이 있습니까?

Bob: 아니요, 하지만 당신이 뭔가를 계속하려는 것 같은 느낌이 들어요. 그러니 계속해서 끝내세요.

Steve: 따라서 빠른 테스트 스위트의 핵심은 로직 처리와 상태 처리를 최대한 분리하는 것입니다. 대부분의 경우 상당히 쉽습니다. 먼저 데이터베이스에서 데이터를 추출합니다. 그런 다음 데이터에 대한 논리를 실행합니다. 마지막으로 결과를 트랜잭션의 데이터베이스에 저장합니다. 그게 당신에게 무엇을 줍니까?

Bob: 내 생각에 당신은 비즈니스 논리 내에서 비용이 많이 드는 데이터베이스 종속성이 없습니다.

Steve: 예, 전체 단위에 대한 테스트는 성공 및 실패 사례만 필요합니다. 트랜잭션이 실행되고 성공하지 않는 한 아무 것도 중요하지 않기 때문입니다.

Bob: 다 좋은데 ActiveRecord에는 데이터베이스를 쿼리할 수 있는 메서드가 너무 많아서 실수하기 쉽습니다.

Steve: 예, 까다로운 문제입니다. 연결 비활성화와 같은 작업을 수행할 수 있습니다. 예를 들어 이것은 존재하지 않는 연결 사양으로 전환하여 데이터베이스를 호출하는 것을 방지합니다.

class ApplicationRecord
  def self.with_no_connection!(&block)
    old_name = connection_specification_name
    self.connection_specification_name = 'with_no_connection active'
    yield
    self.connection_specification_name = old_name
  end
end


Bob: 테스트 중에는 사용할 수 있지만 프로덕션에서는 사용하지 않으므로 테스트 문제로 인해 500점을 받지 않습니다.

class ApplicationRecord
  def self.with_no_connection(&block)
    if Rails.env.test?
      with_no_connection!(&block)
    else
      block.call
    end
  end
end


스티브: 좋은 전화.

밥: 한 번 더 짚고 넘어갑니다. 로직 내에서 데이터베이스에 대한 호출을 피함으로써 테스트 속도를 향상시킵니다. 먼저 필요한 모든 데이터를 추출한 다음 데이터에 대한 논리를 실행하고 마지막으로 데이터베이스에 다시 저장합니다. 약간의 예가 있습니까?

스티브: 맞는 것 같군요. 다음은 컨트롤러의 예입니다.

class MovesController < ApplicationController
  def create
    # query db, build objects
    person = Person.include(:places).find(params[:id])
    old_place = person.current_place
    new_place = Place.find_by(params[:new_address])

    # pass objects to stateless logic
    ApplicationRecord.with_no_connection {
      Move.call(person, old_place, new_place)
    }

    # save state in transaction
    transaction do
      person.save!
      old_place.save!
      new_place.save!
    end

    head :no_content
  end
end


Bob: 일반 Rails와 꽤 비슷해 보입니다. 게다가 Move 테스트에서는 데이터베이스에 아무 것도 필요하지 않습니다! 흥미로운. 어쨌든 이 기사의 제목은 무엇입니까?

Steve: Quadragonal은 Hexagonal의 연극이지만 4개의 ​​부분만 있습니다. 컨트롤러, 상태, 논리 및 보기.

좋은 웹페이지 즐겨찾기