Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions lib/user.rb
Original file line number Diff line number Diff line change
@@ -1,10 +1,26 @@
module Application
class User
attr_reader :username
def initialize(username, name, job)
@username = username
@name = name
@job = job
@observers = []
end

def subscribe(observer)
@observers << observer
end

def update(key, value)
instance_variable_set("@#{key}".to_sym, value)
@observers.each { |o| o.updated self }
end
end

class UserObserver
def updated(context)
print context.username
end
end
end
13 changes: 9 additions & 4 deletions spec/anything_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,22 @@

module Application
describe User do
let(:user) { User.new "josemotanet", "Jose Mota", "Software Designer" }
let(:user) { User.new 'josemotanet', 'Jose Mota', 'Software Designer' }

it 'notifies observers on changes to user' do
observer = double
allow(observer).to receive(:updated).with(:username, "Josemota").and_return(nil)

allow(observer).to receive(:updated).with(user).and_return(nil)

user.subscribe(observer)
user.update(:username, "josemota")

expect(observer).to have_received(:updated).with("josemota")
expect(observer).to have_received(:updated).with(user)
end

it 'prints the changed value' do
observer = UserObserver.new
user.subscribe(observer)
expect{ user.update(:username, "josemota") }.to output("josemota").to_stdout
end
end
end