Nitpick -- this would be more readable if you wrote and used [custom Jasmine matchers](https://github.com/pivotal/jasmine/wiki/Matchers#writing-new-matchers). That way, you could write things like `expect(XModule).toBePlainObject()` or `expect(XModule.Descriptor.prototype.onUpdate).toBeFunction()`.

(This is just a nitpick -- the code is understandable as it is, I'm just suggesting ways that it could be improved.)