共享行为

有时候你可能有多个行为相似的类或方法,并且希望在不编写重复规范的情况下对它们中的所有行为进行测试。根据需要,有很多种方法可以做到这一点。

内联 describe/it 循环

使用内联循环来定义 describeit 块可以避免许多相同、简单的测试的重复。

describe('Element', function() {
  beforeEach(function() {
    this.subject = new Element();
  });

  ['x', 'y', 'width', 'height'].forEach(name => {
    describe(name, function() {
      it('returns a number', function() {
        expect(typeof this.subject[name]()).toBe('number');
      });
    });
  });
});

规范声明帮助器

创建一个单独的声明 describeit 块的帮助器函数,以便在多项测试中重用它。这在描述共享行为时可能很有用。

// Note that this function can exist outside any jasmine block, as long as you
// only call it from inside a jasmine block.
function itActsLikeAPet() {
  it('can be fed', function() {
    this.subject.feed();
    expect(this.subject.hungry()).toBe(false);
  });

  it('can be watered', function() {
    this.subject.drink();
    expect(this.subject.thirsty()).toBe(false);
  });
}

describe('Dog', function() {
  beforeEach(function() {
    this.subject = new Dog();
  });

  itActsLikeAPet();

  it('can bark', function() {
    this.subject.bark();
  });
});

describe('Cat', function() {
  beforeEach(function() {
    this.subject = new Cat();
  });

  itActsLikeAPet();

  it('can meow', function() {
    this.subject.meow();
  });
});

警告

在测试中共享行为可能是强大的工具,但请谨慎使用。