Ideas

Bernardo Dornellas Cysneiros Gomes de Amorim edited this page Dec 12, 2013 · 1 revision

This doesn't actually work, just some ideas:

describe("Person", function() {
  var person;

  before(function() {
    person = new Person();
  });

  when(/gender is male/, function() { person.gender = 'm'; });
  when(/gender is female/, function() { person.gender = 'f'; });

  when(/age is adult/, function() { person.isAdult = true; });
  when(/age is child/, function() { person.isAdult = false; });

  it("has an honorific appropriate to its age and gender", function() {
    when("gender is male and age is adult", function() { expect(person.honorific).toEqual("Mr."); });
    when("gender is female and age is adult", function() { expect(person.honorific).toEqual("Ms."); });
    when("gender is male and age is child", function() { expect(person.honorific).toEqual("Master"); });
    when("gender is female and age is child", function() { expect(person.honorific).toEqual("Miss"); });
  });
});

Stubbing

An idea for stubbing.. In my case, there are some tests that are browser specific, so it's nice to see what might not be tested in a given browser. This allows you to use 'stub' instead of 'it', but it also indicates that no assertions were made in a given test (so using stub is completely optional).

I just put these in my spec_helper.js file, and most of it is reliant on the TrivialReporter bit, so it's a little brittle.. it would be super nice if this was added fully as a base level feature. In ci (ruby_jasmine) it simply outputs "- stubbed", and doesn't indicate anything further, but only when 'stub' is used in place of 'it'.

jasmine.TrivialReporter.prototype.reportSpecResults = function(spec) {
  var results = spec.results();
  var status = results.passed() ? 'passed' : 'failed';
  var style = '';
  if (results.skipped) {
    status = 'skipped';
  }
  if (results.failedCount == 0 && results.passedCount == 0 && !results.skipped) {
    status = 'stubbed';
    style = "background-color: #FFA200; border: 1px solid #000000";
  }
  var specDiv = this.createDom('div', { className: 'spec '  + status, style: style },
      this.createDom('a', { className: 'run_spec', href: '?spec=' + encodeURIComponent(spec.getFullName()) }, "run"),
      this.createDom('a', {
        className: 'description',
        href: '?spec=' + encodeURIComponent(spec.getFullName()),
        title: spec.getFullName()
      }, spec.description));

  var resultItems = results.getItems();
  var messagesDiv = this.createDom('div', { className: 'messages' });
  for (var i = 0; i < resultItems.length; i++) {
    var result = resultItems[i];
    if (result.passed && !result.passed()) {
      messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage fail'}, result.message));

      if (result.trace.stack) {
        messagesDiv.appendChild(this.createDom('div', {className: 'stackTrace'}, result.trace.stack));
      }
    }
  }

  if (messagesDiv.childNodes.length > 0) {
    specDiv.appendChild(messagesDiv);
  }

  this.suiteDivs[spec.suite.getFullName()].appendChild(specDiv);
};

var stub = function(desc, func) {
  return jasmine.getEnv().stub(desc, func);
};

jasmine.Env.prototype.stub = function(description, func) {
  var spec = new jasmine.Spec(this, this.currentSuite, description);
  this.currentSuite.add(spec);
  this.currentSpec = spec;

  if (func) {
    spec.stub(func);
  }

  return spec;
};

jasmine.Spec.prototype.stub = function (e) {
  var expectationResult = new jasmine.MessageResult('- stubbed');
  this.results_.addResult(expectationResult);
};