Skip to content


Subversion checkout URL

You can clone with
Download ZIP
A JavaScript mocking and stubbing framework
tree: 3ce48364bb

Fetching latest commit…

Cannot retrieve the latest commit at this time

Failed to load latest commit information.



Smoke is a JavaScript mocking and stubbing framework. It has a familiar RSpec style interface and whilst it is perfectly capable of being used as a free-standing tool it is currently most useful when used in conjunction with the screw-unit testing framework.

Getting Started (With Screw.Unit)

See spec/suite.html and the test file screw_integration_spec.js for lots of real world usage examples.

but you will need to include the Smoke files and you can get straight to work using the mock() and spec() methods...

foo = {bar: function(attribute){return 'hello'}, baz:'goodbye'};
stub(foo, 'bar').and_return('hi!');
stub(foo, 'baz').and_set_to('welcome');
myMock = mock('test');
expect(foo.baz).to(equal, 'hi!');

Getting Started (Free Standing)

Include the library files in your document...

<!-- require smoke -->
<script src="../lib/smoke.mock.js"></script>
<script src="../lib/smoke.stub.js"></script>

Create your stubs...

foo = {bar: function(attribute){return 'hello'}, baz:'goodbye'};
new Smoke.Stub(foo,'baz').and_set_to('boo');
new Smoke.Stub(foo,'bar').and_return('blah');

Create your mocks...

var myMock = Smoke.Mock();

Create your expectations...

myMock.should_receive('foo').with('bar').exactly(3, 'times').and_return('baz');

Check you expectations...


More About Mocks

Mocks are the main part of the Smoke framework. But Smoke.Mock() has a bit of a dual personality depending on if you pass it a value.

  1. without any arguments it will return a fresh Mock with no more than default Object methods. You will need to mock all your interactions and check all your expectations.
  2. with an argument it will return a 'Mocked' version of the object that was passed in. This is very useful if you just want to mock a single method on your object whilst leaving the rest intact. It's especially helpful for just carrying out expectations on existing objects without any mocking at all.

Smoke expectations are non-destructive meaning that if you add an expectation but don't specify a return value then the previous method will still be invoked (if one exists) and it's result will be returned.

Known Issues

  • Whilst you can stub both functions and properties you can currently only carry out mock expectations on functions. Unfortunately I think this is a language limitation of JavaScript but if anyone has any bright ideas then I'm all ears.


Please send patches, comments or suggestions to

Something went wrong with that request. Please try again.