테스트 DSL에서 기대할 수 있는 Ruby 코드는 무엇입니까?

테스트 DSL에서 생성된 Ruby 코드가 어떻게 생겼는지 궁금한 적이 있습니까?

개발자로서 알아두면 흥미로울 수 있습니다. 어쩌면 너무 끔찍해서 직접 쓰는 것이 불가능할 수도 있습니다. 또는 미니테스트 테스트 세트보다 더 가벼울 수도 있습니다. 누가 알아?

RSpec과 minitest 간의 끝없는 논쟁을 피하면서 이 질문에 답하기 위해 이 게시물의 목적을 위해 RSpec clone 프로젝트를 사용하겠습니다.

RSpec 클론이란 무엇입니까?



정확성, 보안 및 표준화를 강조하는 RSpec의 최소한의 재구현입니다.

커뮤니티RSpec style guide에 설명된 지침 및 모범 사례를 적용하려는 욕구에 힘입어 이 RSpec 클론에는 대부분의 RSpec DSL이 포함되어 마법의 힘 없이 예상 결과를 표현합니다.



더 이상 고민하지 않고 프레임워크가 테스트를 빌드하고 실행하는 방법을 이해하기 위해 DSL 구문과 생성된 Ruby 코드 간의 몇 가지 대응 관계를 살펴보겠습니다. 읽기 쉽도록 이러한 매핑은 메서드별로 그룹화됩니다.

DSL에서 루비로



방법을 기술하십시오



내가 이것을 쓸 때,

RSpec.describe String do
end


이 코드가 생성될 것으로 예상합니다.

Class.new do
  private

  def described_class
    String
  end
end


컨텍스트 메서드



내가 이것을 쓸 때,

RSpec.context "when in a context" do
end


이 코드가 생성될 것으로 예상합니다.

Class.new do
end


주제 방법



내가 이것을 쓸 때,

RSpec.describe ".subject" do
  subject do
    "foo"
  end
end


이 코드가 생성될 것으로 예상합니다.

Class.new do
  private

  def subject
    "foo"
  end
end


포함된 설명 방법



내가 이것을 쓸 때,

RSpec.describe ".describe" do
  describe "embedded describe" do
  end
end


이 코드가 생성될 것으로 예상합니다.

base = Class.new do
end

Class.new(base) do
end


let 메서드



내가 이것을 쓸 때,

RSpec.describe ".let" do
  let(:answer_to_everything) { 41 + one }
  let(:one) { 1 }
end


이 코드가 생성될 것으로 예상합니다.

Class.new do
  private

  def answer_to_everything
    41 + one
  end

  def one
    1
  end
end


방법 전에



내가 이것을 쓸 때,

RSpec.describe ".before" do
  before do
    puts "hello"
  end
end


이 코드가 생성될 것으로 예상합니다.

Class.new do
  private

  def initialize
    puts "hello"
  end
end


방법을 기대



내가 이것을 쓸 때,

RSpec.describe "#expect" do
  it { expect(41.next).to be(42) }
end


이 코드가 생성될 것으로 예상합니다.

description = Class.new do
end

require "matchi/rspec"
require "r_spec/clone/expectation_target"

example = Class.new(description) { include Matchi::Helper }
sandbox = example.new
sandbox.instance_eval { ExpectationTarget::Value.new(41.next).to be(42) }


콘솔에서 다음 결과를 볼 수 있을 것으로 기대합니다.

Success: expected to be 42.


Ruby로 즐거운 테스트



you don't write tests이 아닌 한, 이러한 DSL 인터페이스를 사용하는 이점은 잠재적인 오류가 있는 사양 문서에 추가 논리를 도입하는 것을 제한하고, 알고리즘 복잡성이 낮은 우수한 Ruby 패턴을 사용하도록 장려하고, Ruby 코드를 더 짧고 더 많이 만드는 것입니다. (기계) 읽을 수 있습니다.

According to Adam Hawkins ,

Rspec is a testing DSL. MiniTest is ruby.



나는 둘 다 좋아하고, 당신도 RSpec clone을 좋아하기를 바랍니다.

좋은 웹페이지 즐겨찾기