Pivotal Labs

Main menu

Skip to primary content
Skip to secondary content
  • About
  • Case Studies
  • Team
    • Executives
    • Locations
      • San Francisco (HQ)
      • Boston
      • Boulder
      • Denver
      • London
      • Los Angeles
      • New York
  • Community
    • Blogs
    • Tech Talks
    • Events
  • Careers
    • Lifestyle
    • Principles & Practices
    • Benefits
    • FAQ
    • Apply
  • Tools
  • Contact
    • Press Room
    • Press Releases
    • In The News
    • Press Kit
  • All
  • Labs
  • Standup
  • Tracker

NYC Standup Round-up for Mar 8th – Mar 12th

Pivotal Labs
Friday, March 12, 2010

Spring is in the air here in sunny NYC! Well, it was sunny for a bit. Now it’s turned into that classic film-noir drizzle. That’s authentic New York weather outside our window as we do the Round Up!

Ask for Help

  • I asked, “In Jasmine, how do you spy on a constructor?” Suppose you have a constructor called Widget. Saying spyOn(window, "Widget") swaps out the real Widget function with a spy. The real Widget implementation takes its prototype with it, which means that Widgets created while the constructor is spied on don’t get the methods a Widget would get. That’s true even when you spy with spyOn(window, "Widget").andCallThrough().

    Also, there doesn’t seem to be a way to stub out object construction and return an object of your choosing. In Rspec in Ruby you can say,

    Widget.should_receive(:new).and_return(my_fake_widget)

    because .new is a class method. But in Javascript, new is a keyword which always creates a new object. I’m guessing there’s no good way around this, but if there is one, we could really use it.

    Update: This is, as it turns out, entirely incorrect. Jasmine’s .andReturn() does let you stub constructors properly. I still have no idea how this works. See the comments for more discussion.

Interesting Stuff

  • Todd notifies us that in ActiveRecord, dynamic finders with too-few arguments fail silently. That is, if you say,

    Person.find_by_first_name_and_last_name_and_email(”Todd”, “Persen”)

    and fail to specify a value for email, the value is taken to be nil. That means that the finder will look for someone named “Todd Persen” with a nil email address. You might have meant that. More likely, you made a mistake. AR should probably check the number of arguments it’s given against the number of columns in the finder name.

  • You already know that Pivotal does real Extreme Programming. But did you know that we have…Extreme Breakfast?

  • 0 Shares
  • Share on Facebook
  • Share on Twitter

6 Comments

  1. Adam Milligan says:

    Regarding Jasmine and stubbing constructors, you can do this:

    var fakeWidget = new FakeWidget();
    spyOn(window, 'Widget').andReturn(fakeWidget);
    

    Since the Widget ctor is just a function, new calls the function and gets your fake widget, and then it does its extra magic with the prototype and such on your fake widget. Should work for most things you’d want to do, I believe.

    March 12, 2010 at 8:21 pm

  2. Peter Jaros says:

    The problem is that constructors don’t return their new objects; they just do stuff to them. So even if I do that, `new Widget()` won’t return `fakeWidget`, it’ll return `{}` (since we’ve stubbed out the constructor implementation, and so no properties are added to the new object).

    Just saying `Widget()` *will* return `fakeWidget`, but that’s not how `Widget` is used.

    March 13, 2010 at 7:54 am

  3. Adam Milligan says:

    Aaah, I see the problem you’re having with stubbing the constructor. It’s not that the function is stubbed, it’s that the function’s prototype is not on the stub. Calling new will return the object in the andReturn parameter, but it won’t attach the prototype (or, really, it attaches the prototype associated with the stub to the new object).

    Hm. What happens if you do this:

    var proto = Widget.prototype;
    spyOn(window, 'Widget');
    Widget.prototype = proto;
    

    March 13, 2010 at 10:41 am

  4. Peter Jaros says:

    That was the workaround we went with for the prototype problem that doesn’t solve the fact that `andReturn` doesn’t work on constructors…

    …which turns out to be a complete lie. I really thought we saw that fail, but an isolated test case shows that it works.

    Which is curious to me: how is that possible? My understanding is that `spyOn` replaces the spied function with a spy. That spy can be told what to return with `.andReturn`. But the return value of a constructor is discarded! Saying `new Foo()` *always* creates and returns a new object, doesn’t it? So how does this pass?

    var namespace = {};
    namespace.Constructor = function() {
    this.wasMadeWithRealConstructor = true;
    };
    var myFakeObject = { wasMadeWithRealConstructor: false };
    spyOn(namespace, “Constructor”).andReturn(myFakeObject);
    expect(new namespace.Constructor()).toEqual(myFakeObject);

    March 13, 2010 at 11:25 am

  5. Chad Woolley says:

    OK, who let their pair stick a knife in the toaster? Bad pair…

    March 13, 2010 at 11:22 pm

  6. Rajan Agaskar says:

    fwiw, I believe the following will generally get you the behavior you need, but it requires a fixed set of arguments. We’ll look at supporting functions with properties better in jasmine; hopefully in the future this sort of thing will be transparent.

    >>> function Foo(myVal) { console.log("Passed '" + myVal + "' to Foo Constructor"); this.bar = myVal; }
    >>> Foo.prototype.quux = function() { console.log("Called quux"); return this.bar; }
    function()
    >>> FooClone = Foo
    >>> spyOn(window, "Foo").andCallFake(function(myVal) { console.log("passed '"+ myVal + "' to Fake"); return new FooClone(myVal); });
    function()
    >>> var f = new Foo("test");
    passed 'test' to Fake
    Passed 'test' to Foo Constructor
    >>> f.quux();
    Called quux
    "test"
    >>> expect(window.Foo).wasCalledWith("test")
    true
    

    March 14, 2010 at 1:27 pm

Add New Comment Cancel reply

Your email address will not be published.

Pivotal Labs

Pivotal Labs

Recent Posts

  • Does the set of all sets contain itself?
  • Standup 3/8/2012
  • Standup 3/7/2012
Subscribe to Pivotal's Feed

Author Topics

riddles (1)
agile (167)
capistrano (2)
rails (26)
movember (1)
git (10)
railsdoc (1)
object-design (1)
bdd (3)
cucumber (3)
linkedin (1)
oauth (1)
ruby (17)
tdd (2)
lvh.me (1)
rails 3.1.1 (1)
selenium (6)
homebrew (1)
mysql (5)
rvm (1)
sproutcore (1)
paperclip (2)
pry (1)
amazon (1)
heroku (1)
rails3 (2)
jasmine (3)
design (3)
process (12)
productivity (8)
learning (1)
olin (1)
migrations (2)
mongodb (2)
devise (2)
javascript (13)
rubymine (4)
ipad (1)
whurl (1)
head.js (1)
pairing (2)
tools (4)
pair programming (1)
rspec (10)
rspec2 (1)
ruby19 (1)
incubation (3)
startup (5)
api (1)
presenter (1)
vanna (1)
pivotal tracker (5)
capybara (1)
fakeweb (1)
webmock (1)
intern (1)
ruby on rails (25)
meetup (1)
textmate (1)
testing (20)
solr (4)
nyc-standup (11)
community (1)
opensource (3)
activerecord (4)
chrome (1)
mp4 (1)
activeresource (1)
flash (3)
neo4j (1)
nginx (1)
rsoc (1)
meta programming (1)
agile standup (7)
government (3)
webos (4)
xss (1)
jquery (1)
bundler (2)
ci (3)
gems (5)
postgresql (1)
geminstaller (1)
gemcutter (1)
cloud (2)
rack (2)
refraction (1)
gem (5)
refactoring (1)
validations (1)
webrat (1)
engine-yard (1)
firefox (2)
jsunit (1)
mongrel (2)
thin (1)
unicorn (1)
facebook (1)
rubygems (5)
jruby (1)
actioncontroller (1)
rails 2.3 (1)
palmpre (1)
autotest (1)
mac (2)
hosting (1)
goruco (11)
database (3)
railsconf (11)
gogaruco (4)
deployment (4)
github (1)
ie (1)
ajax (1)
intellij (1)
json (1)
asset packaging (1)
polonium (1)
character encoding (1)
utf-8 (1)
test (3)
civics (1)
hpricot (1)
rake (3)
sms (1)
unicode (1)
iphone (1)
java (1)
safari (1)
memory leaks (1)
rr (3)
editor (1)
css (1)
nyc (3)
performance (5)
fun (5)
enterprise rails (1)
health (1)
new and cool (1)
general (2)
treetop (1)
errors (1)
stack (1)
trace (1)
cache (1)
cookies (1)
freesoftware (1)
conferences (1)
development (1)
driven (1)
proxy (1)
caching (1)
peertopatent (1)
languages (1)
rest (2)
rubyforge (1)
sake (1)
file (1)
upload (1)
constants (1)
osx (1)
terminal (1)
pairprogramming (2)
  • About
  • Case Studies
  • Team
  • Community
  • Careers
  • Tools
  • Contact
  • Labs
  • Events

Contact Us

contact@pivotallabs.com
+1 415-77-PIVOT
TwitterLinkedInFacebook

Pivotal Tracker

Tracker is the award-winning agile project management tool that enables real-time collaboration around a shared, prioritized backlog.
Visit pivotaltracker.com >