12/08/2018, 16:36

Một số câu lệnh hay sử dụng khi viết Rspec

Trong bài viết này, mình sẽ trình bày một số câu lệnh rất hay được sử dụng khi viết rspec Describe, context, it Describe Method Describe tạo ra một example group. Trong khối này bạn có thể lồng vào các example group khác, các ngữ cảnh(context), hoặc là các example bằng cách sử dụng từ khóa ...

Trong bài viết này, mình sẽ trình bày một số câu lệnh rất hay được sử dụng khi viết rspec

Describe, context, it

Describe

  • Method Describe tạo ra một example group. Trong khối này bạn có thể lồng vào các example group khác, các ngữ cảnh(context), hoặc là các example bằng cách sử dụng từ khóa it hoặc specify.
  • Thường thì describe sẽ dùng để chỉ định một unit mà chúng ta muốn test.
  • Ví dụ:
    sample_spec.rb
    describe "something" do
      it "does something" do
      end
    end

Sau khi chạy rspec rspec sample_spec.rb ta nhận được output

something
does something

Context

  • Method context tạo ra một scope, thường được sử dụng để tạo ra ngữ cảnh test.
  • Như đã nói phía trên, Context hay được sử dụng ở bên trong scope của describe Ví dụ:
        #file_name: "sample_test.rb"
        describe "something" do
          context "in one context" do
            it "does one thing" do
            end
          end
          context "in another context" do
            it "does another thing" do
            end
          end
        end

Chạy rspec sample_test.rb ta nhận được output:

            something
              in one context
                does one thing
              in another context
                does another thing

it

  • Method it tạo ra một scope example. Trong scope này, chúng ta thường dùng để tạo ra các object giả định và viết các kì vọng (expect) Ví dụ:
#class User.r
class User
  def hello
    "hello"
  end
end

rpsec:

describe User do
  it "#hello"do
    expect(User.hello).to eq "hello"
  end
end

Let và Let!

Let và Let! là 2 method giúp chúng ta create một object ảo dựa trên activeRecord, không tác động vào database. Object này sẽ được rollback khi bắt đầu một example mới Tuy nhiên, 2 method này có một chút sự khác biệt:

  • Let create ra một object, nhưng nó hoạt động theo cơ chế lazy-evaluated, có nghĩa là object đó sẽ không được tạo ra cho đến khi nó được gọi lên lần đầu tiên ở một nơi khác.
  • Let! thì tạo object ngay khi được chạy Tùy vào ngữ cảnh sử dụng thì ta có thể chọn một trong hai method trên

subject và subject!

  • Subject và subject! mô tả đối tượng ẩn mà scope nó nắm trong nhất mô tả (scope tạo ra bởi describe hoặc context)
  • Subject! khác với subject ở chỗ là nó sẽ thực thi khối block của nó trước khi chạy các khối example, còn subject sẽ chạy các khối example trước, khi subject được call thì nó mới chạy block của subject
subject{[1, 2, 3]}
subject do
  User.new
end

expect và is_expected

Đây là 2 method được sử dụng nhiều nhất, và là trọng tâm của bài test Ở phiên bản cũ hơn(rspec 2.xx) chúng ta sử dụng từ khóa should. Nhưng ở các phiên bản mới, chúng ta sử dụng expect thay thế

  • Method expect và is_expected tạo ra một kì vọng, và chúng ta sẽ mong đợi kì vọng đó đúng hay sai.

  • is_expected là một câu lệnh viết tắt của expect(subject), với is_expected, ta không chú trọng vào đối tượng được test, mà tập chung hơn vào kì vọng của nó. Ví dụ:

    class User < ApplicationRecord
      has_many : posts
      def arr
        [1, 2, 3]
      end
    end
    

    rspec:

    RSpec.describe User, type: :model do
      it{is_expected.to have_many(:posts)}
      it{expect(subject.arr).to eq [1, 2, 3]}
    end
    
0