SlideShare a Scribd company logo
1 of 115
Download to read offline
Testing Ruby with Rspec
- Vysakh Sreenivasan (vysakh0)
I was like this before
This is how I met my
girlfriend
Then this happened :-/
promise me never to execute the program
to see the output i.e ruby file_name.rb
Before we start testing
Pinky promise? Yes?
$ mkdir ruby_testing
$ cd ruby_testing
$ mkdir lib
Open terminal & prepare env
$ bundle init
$ bundle inject rspec, 3.2
$ bundle --binstubs
$ rspec --init
Create Gemfile. Insert & install rspec
4 phases of testing
- Setup
- Exercise
- Verify
- Teardown (Testing framework
does it for us, duh!)
# setup
user = User.new(name: 'yolo')
#expect
user.save
# verify
expect(user.name).not_to be_nil
Wth is expect?
Hmm, it is a matcher?
Describe
the method or class you want to test
# lib/user.rb
class User
end
# spec/user_spec.rb
require ‘spec_helper’
require ‘user’
RSpec.describe User do
end
# lib/sum.rb
def sum(a, b)
a + b
end
# spec/sum_spec.rb
require ‘spec_helper’
require ‘sum’
RSpec.describe ‘#sum’ do
end
Run the specs by the cmd
rspec
# lib/calc.rb
class Calc
def sum(a, b)
a + b
end
end
# spec/calc_spec.rb
require ‘spec_helper’
require ‘calc’
RSpec.describe Calc do
describe ‘#sum’ do
end
end
Tip - use Describe strictly for class & methods
- describe “ClassName” do end
- describe “#instance_method” do end
- describe “.class_method” do end
describe tells who is tested
We need something to
Tell what we are testing of it
it ‘gives sum of 2’ do
end
# or
it {}
require ‘spec_helper’
require ‘calc’
RSpec.describe Calc do
describe ‘#sum’ do
it “returns sum of 2 numbers” do
end
end
end
Lets apply
4 phases of testing
require ‘spec_helper’
require ‘calc’
RSpec.describe ‘Calc’ do
describe ‘#sum’ do
it “returns sum of 2 numbers” do
calc = Calc.new # setup
result = calc.sum(2, 3) # exercise
expect(result).to eql(5) # verify
end
end
end
require ‘calc’
RSpec.describe Calc do
describe ‘#sum’ do
it “returns sum of 2 numbers” do
calc = Calc.new # setup
expect(calc.sum(2, 3)).to eql(5) # exercise & verify
end
end
end
For brevity in the slides,
I’m gonna leave the require ‘spec_helper’
Tip - it statement
- don’t use “should” or “should not” in
description
- say about actual functionality, not what
might be happening
- Use only one expectation per example.
(lets just take a quick look)
Matchers
expect(num.odd?).to be false
#=> num = 2
expect(user.email).to be_falsey
#=> user.email = nil
expect(num).to be >= 3
#=> num = 5
expect(str).to match /testing$/
#=> str = “Welcome to testing”
expect(tiger).to be_an_instance_of(Tiger)
#=> tiger.class => Tiger
expect(tiger).to be_a(Cat)
#=> tiger.class.superclass => Cat
expect { sum }.to raise_error ArugmentError
#=> sum(a, b)
expect(person).to have_attributes(:name => "Jim", :age => 32)
#=> person.name => Jim
expect(list).to start_with(36)
#=> list = [36, 49, 64, 81]
expect(name).to start_with(‘M’)
#=> name = “Matz”
expect(list).to end_with(81)
#=> list = [36, 49, 64, 81]
expect(name).to end_with(‘z’)
#=> name = “Matz”
expect("a string").to include("str")
expect([1, 2]).to include(1, 2)
expect(:a => 1, :b => 2).to include(:a, :b)
expect(:a => 1, :b => 2).to include(:a => 1)
expect([1, 2]).not_to include(1)
expect(name).not_to start_with(‘M’)
#=> name = “DHH
expect(tiger).not_to be_a(Lion)
#=> tiger.class => Tiger
expect([1, 3, 5]).to all( be_odd )
# it is inclusive by default
expect(10).to be_between(5, 10)
# ...but you can make it exclusive: checks in range 4..9
expect(10).not_to be_between(5, 10).exclusive
# ...or explicitly label it inclusive:
expect(10).to be_between(5, 10).inclusive
expect([1, 2, 3]).to contain_exactly(2, 1, 3)
#=> pass
expect([1, 2, 3]).to contain_exactly(2, 1)
#=> fail
expect([1, 2, 3]).to match_array [2, 1, 3]
#=> pass
expect([1, 2, 3]).to match_array [2, 1]
#=> fail
Normal equality expectations do not work well for
floating point values
expect(27.5).to be_within(0.5).of(28.0)
expect(27.5).to be_within(0.5).of(27.2)
expect(27.5).not_to be_within(0.5).of(28.1)
expect(27.5).not_to be_within(0.5).of(26.9)
There are aliases for matchers
use it based on the context
a_value > 3 be < 3
a_string_matching(/foo/) match(/foo/)
a_block_raising(ArgumentError) raise_error(ArgumentError)
See this gist for more aliases https://gist.github.com/JunichiIto/f603d3fbfcf99b914f86
Few matchers and their aliases
is_expected.to
same as expect(subject).to
require ‘calc’
RSpec.describe Calc do
it { expect(Calc).to respond_to(:sum) }
end
require ‘calc’
RSpec.describe Calc do
it { expect(subject).to respond_to(:sum) }
end
require ‘calc’
RSpec.describe Calc do
it { is_expected.to respond_to(:sum) }
end
Compound matchers
using and, or
expect(str).to start_with(“V”).and end_with(“h”)
#=> str = “Vysakh”
expect(stoplight.color).to eq("red").or eq("green").or eq("yellow")
#=> stoplight.color ⇒ “yellow”
change matcher
# lib/team.rb
class Team
attr_accessor :goals
def score
@goals += 1
end
end
require ‘team’
RSpec.describe Team do
describe ‘#score’ do
it ‘increments goals’ do
team = Team.new
expect { team.score }.to change(team, :goals).by(1)
end
end
end
x = y = 0
expect {
x += 1
y += 2
}.to change { x }.to(1).and change { y }.to(2)
Composable matchers
s = "food"
expect { s = "barn" }.to change { s }.
from( a_string_matching(/foo/) ).
to( a_string_matching(/bar/) )
expect(arr).to match [
a_string_ending_with("o"),
a_string_including("e")
]
#=> arr = [“bozo”, “great”]
Magical(predicate) Matchers
expect(0).to be_zero
#=> 0.zero? ⇒ true
expect(2).to be_even
#=> 2.even? ⇒ true
expect(me).to have_job
#=> me.has_job? ⇒ true
Scenarios of methods or
Contexts
# lib/duh.rb
def duh(num)
if num.odd?
“mumbo”
else
“jumbo”
end
end
require ‘duh’
RSpec.describe ‘#duh’ do
it ‘says mumbo if number is odd’ do
expect(duh(3)).to eq “mumbo”
end
it ‘says jumbo if number is not odd’ do
expect(duh(4)).to eq “jumbo”
end
end
Never use if inside it
Instead use context
require ‘duh’
RSpec.describe ‘#duh’ do
context ‘when number is odd’ do
it ‘says mumbo’ do
expect(duh(3)).to eq “mumbo”
end
end
context ‘when number is not odd’ do
it ‘says jumbo’ do
expect(duh(4)).to eq “jumbo”
end
end
end
Tip - Context
- Always has an opposite negative
case
- So, never use a single context.
- Always begin with “when…”
let helper
require ‘team’
RSpec.describe Team do
describe ‘#score’ do
it ‘increments goals’ do
team = Team.new
expect(team.score).to change(Team.goals).by(1)
end
end
describe ‘#matches_won’ do
it ‘gives number of matches won by the team” do
team = Team.new
expect(team.matches_won).to eq 0
end
end
end
require ‘team’
RSpec.describe Team do
let(:team) { Team.new }
describe ‘#score’ do
it ‘increments goals’ do
expect(team.score).to change(Team.goals).by(1)
end
end
describe ‘#matches_won’ do
it ‘gives number of watches won by the team” do
expect(team.matches_won).to eq 0
end
end
end
def team
Team.new
end
let(:team) is same as
Is invoked only when it is called
before & after helper
require ‘team.’
RSpec.describe Team do
before do
@team = Team.new
puts “Called every time before the it or specify block”
end
describe ‘#score’ do
it ‘increments goals of the match’ do
expect(@team.score).to change(Team.goals).by(1)
end
it ‘increments total goals of the Team’’ do
expect(@team.score).to change(Team.total_goals).by(1)
end
end
end
require ‘team’
RSpec.describe Team do
before(:suite) do
puts “Get ready folks! Testing are coming!! :D ”
end
describe ‘#score’ do
it ‘increments goals of the match’ do
expect(@team.score).to change(Team.goals).by(1)
end
it ‘increments total goals of the Team’’ do
expect(@team.score).to change(Team.total_goals).by(1)
end
end
end
Types passed to before/after
- :example (runs for each test)
- :context (runs for each context)
- :suite (runs for entire suite, only
once, see database cleaner gem)
Tip - Use let instead of before
- To create data for the spec
examples.
- let blocks get lazily evaluated
# use this:
let(:article) { FactoryGirl.create(:article) }
# ... instead of this:
before { @article = FactoryGirl.create(:article) }
Tip: Use before/after for
- actions or
- when the same obj/variable needs to be
used in different examples
before do
@book = Book.new(title: "RSpec Intro")
@customer = Customer.new
@order = Order.new(@customer, @book)
@order.submit
end
Use factorygirl to
create test objects
Stubs
class PriceCalculator
def add(product)
products << product
end
def products
@products ||= []
end
def total
@products.map(&:price).inject(&:+)
end
end
class Product
end
describe PriceCalculator do
it "allows for method stubbing" do
calculator = PriceCalculator.new
calculator.add(double(price: 25.4))
calculator.add(double(price: 101))
expect(calculator.total).to eq 126.4
end
end
#This works even if there is no Product class is defined #
in the actual program
class Product
attr_reader :price
end
class PriceCalculator
def add(product)
products << product
end
def products
@products ||= []
end
def total
@products.map(&:price).inject(&:+)
end
end
describe PriceCalculator do
it "allows for method stubbing" do
calculator = PriceCalculator.new
calculator.add instance_double("Product", price: 25.4)
calculator.add instance_double("Product", price: 101)
expect(calculator.total).to eq 126.4
end
end
# throws and error if a Product class or its methods are #
not defined
$ irb
> require ‘rspec/mocks/standalone’
> class User; end
> allow(User).to receive(:wow).and_return(“Yolo”)
> User.wow
=> “Yolo Yolo”
You can also use block to return instead
and_return
allow(User).to receive(:wow) { (“Yolo”) }
3 types of return for wow method
allow(User).to receive(:wow)
.and_return(“yolo”, “lol”, “3rd time”)
Diff output when running diff times
User.wow #=> yolo
User.wow #=> lol
User.wow #=> 3rd time
User.wow #=> 3rd time
User.wow #=> 3rd time
So, you could use it as if it is 2 different objects
2.times { calculator.add product_stub }
Diff between double & instance_double
Instance double requires
- class to be defined
- methods to be defined in that class.
- Only then a method can be allowed to it.
Use stubs, mocks, spies
with caution
Skip and Focus tests
Say you have 3 failing tests
xit
- add x to all but one failing it
blocks
- xit blocks will be skipped
You can use xit or skip: true
xit “does this thing” do
end
it “asserts name”, skip: true do
end
it “asserts name”, skip: “Bored right now” do
end
it “asserts name” do
pending
end
it “asserts name” do
skip
end
You can use skip/pending inside it
Say you have 20 tests, all
passing but very slow
You can use fit to focus specific test
fit “asserts name” do
end
#=> rspec --tag focus
#=> only this block will be run
Another way to focus specific test
it “asserts name”, focus: true do
end
#=> rspec --tag focus
#=> only this block will be run
You can also use the same in describe or
context
fdescribe “#save” do
end
describe “#save”, skip: true do
end
Use subject when possible
describe Article do
subject { FactoryGirl.create(:article) }
it 'is not published on creation' do
expect(subject).not_to be_published
end
end
Shared examples
RSpec.describe FacebookAPI do
it "has posts" do
expect(FbAPI.new("vysakh0")).to respond_to :posts
end
it_behaves_like("API", FbAPI.new(“vysakh0”))
end
Rspec.describe TwitterAPI do
it "has tweets" do
expect(TwitterAPI.new("vysakh0")).to respond_to :tweets
end
it_behaves_like("API", TwitterAPI.new(“vysakh0”))
end
RSpec.shared_examples_for "API" do |api|
it "returns a formatted hash" do
expect(api.profile).to match [
a_hash_including(
name: an_instance_of(String),
category: an_instance_of(String),
price: an_instance_of(Float))
]
end
end
Shared context
RSpec.shared_context "shared stuff" do
before { @some_var = :some_value }
def shared_method
"it works"
end
let(:shared_let) { {'arbitrary' => 'object'} }
subject do
'this is the subject'
end
end
require "./shared_stuff.rb"
RSpec.describe "#using_shared_stuff'" do
include_context "shared stuff"
it "has access to methods defined in shared context" do
expect(shared_method).to eq("it works")
end
end
Custom Matchers
RSpec::Matchers.define :be_a_multiple_of do |expected|
match do |actual|
actual % expected == 0
end
end
# usage:
expect(9).to be_a_multiple_of(3)
RSpec::Matchers.define :be_a_palindrome do
match do |actual|
actual.reverse == actual
end
end
# usage:
expect(“ror”).to be_a_palindrome
RSpec::Matchers.define :be_bigger_than do |min|
chain :but_smaller_than, :max
match do |value|
value > min && value < max
end
end
# usage:
expect(10).to be_bigger_than(5).but_smaller_than(15)
Define negated matcher
RSpec::Matchers.define define_negated_matcher :exclude, :include
# rather than
# expect(odd_numbers).not_to include(12)
expect((odd_numbers).to exclude(12)
# user_a = User.new(“A”); user_b = User.new(“B”)
# users = [user_a, user_b]
expect(users).to include(user_a).and exclude(user_b)
There are lot more
awesomeness!!
- https://relishapp.com/rspec
- https://github.com/reachlocal/rspec-style-
guide
- https://github.com/eliotsykes/rspec-rails-
examples (rspec-rails)
- http://betterspecs.org/
-
Resources
Carpe Diem

More Related Content

What's hot

Automated testing with RSpec
Automated testing with RSpecAutomated testing with RSpec
Automated testing with RSpecNascenia IT
 
Rspec API Documentation
Rspec API DocumentationRspec API Documentation
Rspec API DocumentationSmartLogic
 
Introduction to testing in Rails
Introduction to testing in RailsIntroduction to testing in Rails
Introduction to testing in Railsbenlcollins
 
Testing Javascript with Jasmine
Testing Javascript with JasmineTesting Javascript with Jasmine
Testing Javascript with JasmineTim Tyrrell
 
How To Test Everything
How To Test EverythingHow To Test Everything
How To Test Everythingnoelrap
 
RSpec User Stories
RSpec User StoriesRSpec User Stories
RSpec User Storiesrahoulb
 
AngularJS Unit Testing
AngularJS Unit TestingAngularJS Unit Testing
AngularJS Unit TestingPrince Norin
 
Testing JS with Jasmine
Testing JS with JasmineTesting JS with Jasmine
Testing JS with JasmineEvgeny Gurin
 
Introduction to unit testing
Introduction to unit testingIntroduction to unit testing
Introduction to unit testingArtem Shoobovych
 
PhpSpec 2.0 ilustrated by examples
PhpSpec 2.0 ilustrated by examplesPhpSpec 2.0 ilustrated by examples
PhpSpec 2.0 ilustrated by examplesMarcello Duarte
 
Painless Javascript Unit Testing
Painless Javascript Unit TestingPainless Javascript Unit Testing
Painless Javascript Unit TestingBenjamin Wilson
 
Unit Testing JavaScript Applications
Unit Testing JavaScript ApplicationsUnit Testing JavaScript Applications
Unit Testing JavaScript ApplicationsYnon Perek
 
Unit testing with mocha
Unit testing with mochaUnit testing with mocha
Unit testing with mochaRevath S Kumar
 

What's hot (20)

Automated testing with RSpec
Automated testing with RSpecAutomated testing with RSpec
Automated testing with RSpec
 
TDD, BDD, RSpec
TDD, BDD, RSpecTDD, BDD, RSpec
TDD, BDD, RSpec
 
Rspec API Documentation
Rspec API DocumentationRspec API Documentation
Rspec API Documentation
 
Introduction to testing in Rails
Introduction to testing in RailsIntroduction to testing in Rails
Introduction to testing in Rails
 
Testing Javascript with Jasmine
Testing Javascript with JasmineTesting Javascript with Jasmine
Testing Javascript with Jasmine
 
TDD with phpspec2
TDD with phpspec2TDD with phpspec2
TDD with phpspec2
 
How To Test Everything
How To Test EverythingHow To Test Everything
How To Test Everything
 
RSpec User Stories
RSpec User StoriesRSpec User Stories
RSpec User Stories
 
TDD with PhpSpec
TDD with PhpSpecTDD with PhpSpec
TDD with PhpSpec
 
AngularJS Unit Testing
AngularJS Unit TestingAngularJS Unit Testing
AngularJS Unit Testing
 
RSpec
RSpecRSpec
RSpec
 
Excellent
ExcellentExcellent
Excellent
 
Rails is not just Ruby
Rails is not just RubyRails is not just Ruby
Rails is not just Ruby
 
PHPSpec BDD for PHP
PHPSpec BDD for PHPPHPSpec BDD for PHP
PHPSpec BDD for PHP
 
Testing JS with Jasmine
Testing JS with JasmineTesting JS with Jasmine
Testing JS with Jasmine
 
Introduction to unit testing
Introduction to unit testingIntroduction to unit testing
Introduction to unit testing
 
PhpSpec 2.0 ilustrated by examples
PhpSpec 2.0 ilustrated by examplesPhpSpec 2.0 ilustrated by examples
PhpSpec 2.0 ilustrated by examples
 
Painless Javascript Unit Testing
Painless Javascript Unit TestingPainless Javascript Unit Testing
Painless Javascript Unit Testing
 
Unit Testing JavaScript Applications
Unit Testing JavaScript ApplicationsUnit Testing JavaScript Applications
Unit Testing JavaScript Applications
 
Unit testing with mocha
Unit testing with mochaUnit testing with mocha
Unit testing with mocha
 

Similar to Testing Ruby with Rspec - Key aspects and best practices

Advanced Perl Techniques
Advanced Perl TechniquesAdvanced Perl Techniques
Advanced Perl TechniquesDave Cross
 
Real life-coffeescript
Real life-coffeescriptReal life-coffeescript
Real life-coffeescriptDavid Furber
 
A limited guide to intermediate and advanced Ruby
A limited guide to intermediate and advanced RubyA limited guide to intermediate and advanced Ruby
A limited guide to intermediate and advanced RubyVysakh Sreenivasan
 
Ruby Metaprogramming
Ruby MetaprogrammingRuby Metaprogramming
Ruby MetaprogrammingThaichor Seng
 
Attributes Unwrapped: Lessons under the surface of active record
Attributes Unwrapped: Lessons under the surface of active recordAttributes Unwrapped: Lessons under the surface of active record
Attributes Unwrapped: Lessons under the surface of active record.toster
 
Testing Code and Assuring Quality
Testing Code and Assuring QualityTesting Code and Assuring Quality
Testing Code and Assuring QualityKent Cowgill
 
Ruby Programming Language
Ruby Programming LanguageRuby Programming Language
Ruby Programming LanguageDuda Dornelles
 
A linguagem de programação Ruby - Robson "Duda" Sejan Soares Dornelles
A linguagem de programação Ruby - Robson "Duda" Sejan Soares DornellesA linguagem de programação Ruby - Robson "Duda" Sejan Soares Dornelles
A linguagem de programação Ruby - Robson "Duda" Sejan Soares DornellesTchelinux
 
Uses & Abuses of Mocks & Stubs
Uses & Abuses of Mocks & StubsUses & Abuses of Mocks & Stubs
Uses & Abuses of Mocks & StubsPatchSpace Ltd
 
Rails-like JavaScript using CoffeeScript, Backbone.js and Jasmine
Rails-like JavaScript using CoffeeScript, Backbone.js and JasmineRails-like JavaScript using CoffeeScript, Backbone.js and Jasmine
Rails-like JavaScript using CoffeeScript, Backbone.js and JasmineRaimonds Simanovskis
 
CoffeeScript - A Rubyist's Love Affair
CoffeeScript - A Rubyist's Love AffairCoffeeScript - A Rubyist's Love Affair
CoffeeScript - A Rubyist's Love AffairMark
 
PowerShell_LangRef_v3 (1).pdf
PowerShell_LangRef_v3 (1).pdfPowerShell_LangRef_v3 (1).pdf
PowerShell_LangRef_v3 (1).pdfoutcast96
 
Java script advance-auroskills (2)
Java script advance-auroskills (2)Java script advance-auroskills (2)
Java script advance-auroskills (2)BoneyGawande
 

Similar to Testing Ruby with Rspec - Key aspects and best practices (20)

Advanced Perl Techniques
Advanced Perl TechniquesAdvanced Perl Techniques
Advanced Perl Techniques
 
Real life-coffeescript
Real life-coffeescriptReal life-coffeescript
Real life-coffeescript
 
A limited guide to intermediate and advanced Ruby
A limited guide to intermediate and advanced RubyA limited guide to intermediate and advanced Ruby
A limited guide to intermediate and advanced Ruby
 
Ruby Metaprogramming
Ruby MetaprogrammingRuby Metaprogramming
Ruby Metaprogramming
 
Typescript barcelona
Typescript barcelonaTypescript barcelona
Typescript barcelona
 
PHP PPT FILE
PHP PPT FILEPHP PPT FILE
PHP PPT FILE
 
Attributes Unwrapped: Lessons under the surface of active record
Attributes Unwrapped: Lessons under the surface of active recordAttributes Unwrapped: Lessons under the surface of active record
Attributes Unwrapped: Lessons under the surface of active record
 
Testing Code and Assuring Quality
Testing Code and Assuring QualityTesting Code and Assuring Quality
Testing Code and Assuring Quality
 
Ruby Programming Language
Ruby Programming LanguageRuby Programming Language
Ruby Programming Language
 
A linguagem de programação Ruby - Robson "Duda" Sejan Soares Dornelles
A linguagem de programação Ruby - Robson "Duda" Sejan Soares DornellesA linguagem de programação Ruby - Robson "Duda" Sejan Soares Dornelles
A linguagem de programação Ruby - Robson "Duda" Sejan Soares Dornelles
 
Rspec
RspecRspec
Rspec
 
Hidden Gems of Ruby 1.9
Hidden Gems of Ruby 1.9Hidden Gems of Ruby 1.9
Hidden Gems of Ruby 1.9
 
Rspec
RspecRspec
Rspec
 
Uses & Abuses of Mocks & Stubs
Uses & Abuses of Mocks & StubsUses & Abuses of Mocks & Stubs
Uses & Abuses of Mocks & Stubs
 
Scala idioms
Scala idiomsScala idioms
Scala idioms
 
Rails-like JavaScript using CoffeeScript, Backbone.js and Jasmine
Rails-like JavaScript using CoffeeScript, Backbone.js and JasmineRails-like JavaScript using CoffeeScript, Backbone.js and Jasmine
Rails-like JavaScript using CoffeeScript, Backbone.js and Jasmine
 
CoffeeScript - A Rubyist's Love Affair
CoffeeScript - A Rubyist's Love AffairCoffeeScript - A Rubyist's Love Affair
CoffeeScript - A Rubyist's Love Affair
 
Test driven development_for_php
Test driven development_for_phpTest driven development_for_php
Test driven development_for_php
 
PowerShell_LangRef_v3 (1).pdf
PowerShell_LangRef_v3 (1).pdfPowerShell_LangRef_v3 (1).pdf
PowerShell_LangRef_v3 (1).pdf
 
Java script advance-auroskills (2)
Java script advance-auroskills (2)Java script advance-auroskills (2)
Java script advance-auroskills (2)
 

More from Vysakh Sreenivasan

More from Vysakh Sreenivasan (6)

Caching in rails
Caching in railsCaching in rails
Caching in rails
 
Introduction to Vim, the text editor
Introduction to Vim, the text editorIntroduction to Vim, the text editor
Introduction to Vim, the text editor
 
Ruby on Rails for beginners
Ruby on Rails for beginnersRuby on Rails for beginners
Ruby on Rails for beginners
 
What's new in Rails 4.1
What's new in Rails 4.1What's new in Rails 4.1
What's new in Rails 4.1
 
Building Rich Ruby on Rails with Emberjs
Building Rich Ruby on Rails with EmberjsBuilding Rich Ruby on Rails with Emberjs
Building Rich Ruby on Rails with Emberjs
 
Introduction to vim
Introduction to vimIntroduction to vim
Introduction to vim
 

Recently uploaded

Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024StefanoLambiase
 
How to submit a standout Adobe Champion Application
How to submit a standout Adobe Champion ApplicationHow to submit a standout Adobe Champion Application
How to submit a standout Adobe Champion ApplicationBradBedford3
 
Software Coding for software engineering
Software Coding for software engineeringSoftware Coding for software engineering
Software Coding for software engineeringssuserb3a23b
 
Unveiling Design Patterns: A Visual Guide with UML Diagrams
Unveiling Design Patterns: A Visual Guide with UML DiagramsUnveiling Design Patterns: A Visual Guide with UML Diagrams
Unveiling Design Patterns: A Visual Guide with UML DiagramsAhmed Mohamed
 
cpct NetworkING BASICS AND NETWORK TOOL.ppt
cpct NetworkING BASICS AND NETWORK TOOL.pptcpct NetworkING BASICS AND NETWORK TOOL.ppt
cpct NetworkING BASICS AND NETWORK TOOL.pptrcbcrtm
 
Recruitment Management Software Benefits (Infographic)
Recruitment Management Software Benefits (Infographic)Recruitment Management Software Benefits (Infographic)
Recruitment Management Software Benefits (Infographic)Hr365.us smith
 
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...OnePlan Solutions
 
A healthy diet for your Java application Devoxx France.pdf
A healthy diet for your Java application Devoxx France.pdfA healthy diet for your Java application Devoxx France.pdf
A healthy diet for your Java application Devoxx France.pdfMarharyta Nedzelska
 
Exploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdf
Exploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdfExploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdf
Exploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdfkalichargn70th171
 
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样umasea
 
Balasore Best It Company|| Top 10 IT Company || Balasore Software company Odisha
Balasore Best It Company|| Top 10 IT Company || Balasore Software company OdishaBalasore Best It Company|| Top 10 IT Company || Balasore Software company Odisha
Balasore Best It Company|| Top 10 IT Company || Balasore Software company Odishasmiwainfosol
 
Unveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New FeaturesUnveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New FeaturesŁukasz Chruściel
 
CRM Contender Series: HubSpot vs. Salesforce
CRM Contender Series: HubSpot vs. SalesforceCRM Contender Series: HubSpot vs. Salesforce
CRM Contender Series: HubSpot vs. SalesforceBrainSell Technologies
 
SpotFlow: Tracking Method Calls and States at Runtime
SpotFlow: Tracking Method Calls and States at RuntimeSpotFlow: Tracking Method Calls and States at Runtime
SpotFlow: Tracking Method Calls and States at Runtimeandrehoraa
 
React Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief UtamaReact Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief UtamaHanief Utama
 
英国UN学位证,北安普顿大学毕业证书1:1制作
英国UN学位证,北安普顿大学毕业证书1:1制作英国UN学位证,北安普顿大学毕业证书1:1制作
英国UN学位证,北安普顿大学毕业证书1:1制作qr0udbr0
 
Powering Real-Time Decisions with Continuous Data Streams
Powering Real-Time Decisions with Continuous Data StreamsPowering Real-Time Decisions with Continuous Data Streams
Powering Real-Time Decisions with Continuous Data StreamsSafe Software
 
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...OnePlan Solutions
 
Cloud Data Center Network Construction - IEEE
Cloud Data Center Network Construction - IEEECloud Data Center Network Construction - IEEE
Cloud Data Center Network Construction - IEEEVICTOR MAESTRE RAMIREZ
 
Folding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a seriesFolding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a seriesPhilip Schwarz
 

Recently uploaded (20)

Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
 
How to submit a standout Adobe Champion Application
How to submit a standout Adobe Champion ApplicationHow to submit a standout Adobe Champion Application
How to submit a standout Adobe Champion Application
 
Software Coding for software engineering
Software Coding for software engineeringSoftware Coding for software engineering
Software Coding for software engineering
 
Unveiling Design Patterns: A Visual Guide with UML Diagrams
Unveiling Design Patterns: A Visual Guide with UML DiagramsUnveiling Design Patterns: A Visual Guide with UML Diagrams
Unveiling Design Patterns: A Visual Guide with UML Diagrams
 
cpct NetworkING BASICS AND NETWORK TOOL.ppt
cpct NetworkING BASICS AND NETWORK TOOL.pptcpct NetworkING BASICS AND NETWORK TOOL.ppt
cpct NetworkING BASICS AND NETWORK TOOL.ppt
 
Recruitment Management Software Benefits (Infographic)
Recruitment Management Software Benefits (Infographic)Recruitment Management Software Benefits (Infographic)
Recruitment Management Software Benefits (Infographic)
 
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...
 
A healthy diet for your Java application Devoxx France.pdf
A healthy diet for your Java application Devoxx France.pdfA healthy diet for your Java application Devoxx France.pdf
A healthy diet for your Java application Devoxx France.pdf
 
Exploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdf
Exploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdfExploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdf
Exploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdf
 
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样
 
Balasore Best It Company|| Top 10 IT Company || Balasore Software company Odisha
Balasore Best It Company|| Top 10 IT Company || Balasore Software company OdishaBalasore Best It Company|| Top 10 IT Company || Balasore Software company Odisha
Balasore Best It Company|| Top 10 IT Company || Balasore Software company Odisha
 
Unveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New FeaturesUnveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New Features
 
CRM Contender Series: HubSpot vs. Salesforce
CRM Contender Series: HubSpot vs. SalesforceCRM Contender Series: HubSpot vs. Salesforce
CRM Contender Series: HubSpot vs. Salesforce
 
SpotFlow: Tracking Method Calls and States at Runtime
SpotFlow: Tracking Method Calls and States at RuntimeSpotFlow: Tracking Method Calls and States at Runtime
SpotFlow: Tracking Method Calls and States at Runtime
 
React Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief UtamaReact Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief Utama
 
英国UN学位证,北安普顿大学毕业证书1:1制作
英国UN学位证,北安普顿大学毕业证书1:1制作英国UN学位证,北安普顿大学毕业证书1:1制作
英国UN学位证,北安普顿大学毕业证书1:1制作
 
Powering Real-Time Decisions with Continuous Data Streams
Powering Real-Time Decisions with Continuous Data StreamsPowering Real-Time Decisions with Continuous Data Streams
Powering Real-Time Decisions with Continuous Data Streams
 
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
 
Cloud Data Center Network Construction - IEEE
Cloud Data Center Network Construction - IEEECloud Data Center Network Construction - IEEE
Cloud Data Center Network Construction - IEEE
 
Folding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a seriesFolding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a series
 

Testing Ruby with Rspec - Key aspects and best practices