Bird
Raised Fist0
Rubyprogramming~5 mins

Let and before hooks in Ruby - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What is the purpose of the let method in Ruby testing?
The let method defines a memoized helper method. It lazily creates and caches a value the first time it is called in a test, so the same value is reused within that example.
Click to reveal answer
beginner
How does a before hook work in Ruby testing frameworks like RSpec?
A before hook runs a block of code before each example (test). It is used to set up common test data or state needed for the tests.
Click to reveal answer
intermediate
What is the difference between let and before hooks?
let defines a lazily evaluated value that is memoized per example, while before hooks run code eagerly before each example, often for setup tasks.
Click to reveal answer
intermediate
Can let variables be accessed inside before hooks?
Yes, but the let variable is not evaluated until it is called. If you call it inside a before hook, it will be created at that time.
Click to reveal answer
intermediate
Why is it better to use let instead of instance variables in tests?
let helps avoid unnecessary setup by creating values only when needed, making tests faster and cleaner. It also scopes the value to each example, avoiding state leaks.
Click to reveal answer
What does the let method do in Ruby tests?
ADefines a memoized helper method evaluated lazily
BRuns code before each test example
CDefines a global variable
DRuns code after each test example
When is the code inside a before hook executed?
AOnly when a <code>let</code> variable is called
BAfter each test example
COnly once before all tests
DBefore each test example
Which is true about let variables in RSpec?
AThey are evaluated lazily and cached per example
BThey are evaluated immediately when defined
CThey run before all tests
DThey cannot be used inside <code>before</code> hooks
What happens if you call a let variable inside a before hook?
AIt raises an error
BIt is ignored
CIt is evaluated at that time and memoized
DIt runs after the test example
Why might you prefer let over instance variables for test setup?
ABecause <code>let</code> variables are global
BBecause <code>let</code> variables are lazily evaluated and scoped per example
CBecause instance variables are faster
DBecause <code>let</code> variables run after tests
Explain how let and before hooks differ in their execution and purpose in Ruby tests.
Think about when the code runs and what it is used for.
You got /4 concepts.
    Describe a scenario where using let is better than using instance variables in test setup.
    Consider test speed and isolation.
    You got /4 concepts.

      Practice

      (1/5)
      1. What is the main purpose of using let in Ruby tests?
      easy
      A. To create reusable values that are lazily evaluated
      B. To run setup code before each test
      C. To define a test case
      D. To clean up after tests run

      Solution

      1. Step 1: Understand let behavior

        let defines a value that is created only when needed (lazy evaluation) and reused within the same test.
      2. Step 2: Differentiate from before

        before runs code before each test but does not create reusable values like let.
      3. Final Answer:

        To create reusable values that are lazily evaluated -> Option A
      4. Quick Check:

        let = reusable lazy value [OK]
      Hint: Remember: let creates values, before runs code [OK]
      Common Mistakes:
      • Confusing let with before hook
      • Thinking let runs before each test eagerly
      • Assuming let defines test cases
      2. Which of the following is the correct syntax to define a let variable named user with value "Alice"?
      easy
      A. before { user = "Alice" }
      B. let user = "Alice"
      C. let(:user) { "Alice" }
      D. let user { "Alice" }

      Solution

      1. Step 1: Recall let syntax

        let takes a symbol argument and a block returning the value: let(:name) { value }.
      2. Step 2: Check each option

        let(:user) { "Alice" } matches correct syntax. Options B and D miss parentheses or block syntax. before { user = "Alice" } uses before, not let.
      3. Final Answer:

        let(:user) { "Alice" } -> Option C
      4. Quick Check:

        Correct let syntax uses symbol and block [OK]
      Hint: Use parentheses and block for let: let(:name) { value } [OK]
      Common Mistakes:
      • Omitting parentheses around symbol
      • Using assignment instead of block
      • Confusing let with before syntax
      3. Given the code below, what will be printed when the test runs?
      let(:count) { 0 }
      before { count += 1 }
      it "increments count" do
        puts count
      end
      medium
      A. 0
      B. 1
      C. 2
      D. Error: undefined method += for nil

      Solution

      1. Step 1: Understand let and before interaction

        let(:count) { 0 } defines a method returning 0. But count is not a variable; it's a method call.
      2. Step 2: Analyze before { count += 1 }

        count += 1 tries to modify count as a variable, but count is a method, so Ruby raises an error: undefined method += for nil or no local variable.
      3. Final Answer:

        Error: undefined method += for nil -> Option D
      4. Quick Check:

        Cannot modify let method return with += [OK]
      Hint: let defines methods, not variables; += fails on method calls [OK]
      Common Mistakes:
      • Assuming let creates a variable to modify
      • Expecting count to increment automatically
      • Ignoring that let is lazily evaluated method
      4. Identify the error in the following test setup:
      let(:numbers) { [1, 2, 3] }
      before do
        numbers << 4
      end
      it "checks numbers length" do
        expect(numbers.length).to eq(4)
      end
      medium
      A. Modifying let value causes shared state between tests
      B. No error; test passes as expected
      C. Syntax error in let definition
      D. before block runs after the test

      Solution

      1. Step 1: Understand let and before execution order

        let(:numbers) memoizes a new array [1,2,3] the first time numbers is called in each test example.
      2. Step 2: Trace the test execution

        In before, numbers << 4 calls/memoizes numbers and mutates it to [1,2,3,4]. In it, numbers.length (memoized) is 4, so test passes.
      3. Final Answer:

        No error; test passes as expected -> Option B
      4. Quick Check:

        Mutation in before(:each) affects per-example memoized let correctly [OK]
      Hint: let memoizes per example; before mutation visible consistently in test [OK]
      Common Mistakes:
      • Misunderstanding per-example memoization (no inter-test sharing)
      • Thinking mutation always causes shared state between tests
      • Confusing before(:each) with before(:all)
      5. You want to test a user object that requires setup before each test and a reusable user name. Which is the best way to combine let and before hooks?
      let(:user_name) { "Bob" }
      before do
        @user = User.new(name: user_name)
        @user.activate!
      end
      it "checks user is active" do
        expect(@user.active?).to be true
      end

      What is the main advantage of this approach?
      hard
      A. Separates reusable data (user_name) from setup actions (before)
      B. Runs let block after before hook
      C. Avoids using instance variables for test data
      D. Ensures user_name is reset after each test

      Solution

      1. Step 1: Analyze separation of concerns

        let(:user_name) defines reusable data lazily, while before runs setup code creating and activating user.
      2. Step 2: Understand benefits

        This keeps data definition and setup logic cleanly separated, improving test readability and maintainability.
      3. Final Answer:

        Separates reusable data (user_name) from setup actions (before) -> Option A
      4. Quick Check:

        let for data, before for setup [OK]
      Hint: Use let for data, before for setup steps [OK]
      Common Mistakes:
      • Thinking let runs before before hook
      • Avoiding instance variables unnecessarily
      • Confusing reset behavior of let
      Recommended

      Ready to prove it?

      Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

      10 questions~5 mineasy hard