diff --git a/lib/user.rb b/lib/user.rb index d9ad86a..e7b9a1d 100644 --- a/lib/user.rb +++ b/lib/user.rb @@ -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 diff --git a/spec/anything_spec.rb b/spec/anything_spec.rb index 860a162..4d784a5 100644 --- a/spec/anything_spec.rb +++ b/spec/anything_spec.rb @@ -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