mas/Carthage/Checkouts/Quick/Documentation/zh-cn/SharedExamples.md
2018-09-05 09:54:08 +10:00

3.2 KiB
Raw Blame History

使用 Shared Assertion 来复用测试模板代码

在某种场合下,一些特定的测试代码可以应用在不同的对象上。

比如,假设有一个叫 Edible 的协议。当一只海豚吃了标识为 Edible 的食物时,它会变得高兴。MackerelCod 都遵循 Edible 协议。这个时候Quick 的 shared example共享用例能帮你更容易地测试 MackerelCod 的行为。

下面的例子为一些 Edible 的食物定义了一组共享用例,以测试 mackerel 和 cod 的行为。

// Swift

import Quick
import Nimble

class EdibleSharedExamplesConfiguration: QuickConfiguration {
  override class func configure(_ configuration: Configuration) {
    sharedExamples("something edible") { (sharedExampleContext: SharedExampleContext) in
      it("makes dolphins happy") {
        let dolphin = Dolphin(happy: false)
        let edible = sharedExampleContext()["edible"]
        dolphin.eat(edible)
        expect(dolphin.isHappy).to(beTruthy())
      }
    }
  }
}

class MackerelSpec: QuickSpec {
  override func spec() {
    var mackerel: Mackerel!
    beforeEach {
      mackerel = Mackerel()
    }

    itBehavesLike("something edible") { ["edible": mackerel] }
  }
}

class CodSpec: QuickSpec {
  override func spec() {
    var cod: Cod!
    beforeEach {
      cod = Cod()
    }

    itBehavesLike("something edible") { ["edible": cod] }
  }
}
// Objective-C

@import Quick;
@import Nimble;

QuickConfigurationBegin(EdibleSharedExamplesConfiguration)

+ (void)configure:(Configuration *configuration) {
  sharedExamples(@"something edible", ^(QCKDSLSharedExampleContext exampleContext) {
    it(@"makes dolphins happy") {
      Dolphin *dolphin = [[Dolphin alloc] init];
      dolphin.happy = NO;
      id<Edible> edible = exampleContext()[@"edible"];
      [dolphin eat:edible];
      expect(dolphin.isHappy).to(beTruthy())
    }
  });
}

QuickConfigurationEnd

QuickSpecBegin(MackerelSpec)

__block Mackerel *mackerel = nil;
beforeEach(^{
  mackerel = [[Mackerel alloc] init];
});

itBehavesLike(@"someting edible", ^{ return @{ @"edible": mackerel }; });

QuickSpecEnd

QuickSpecBegin(CodSpec)

__block Mackerel *cod = nil;
beforeEach(^{
  cod = [[Cod alloc] init];
});

itBehavesLike(@"someting edible", ^{ return @{ @"edible": cod }; });

QuickSpecEnd

共享用例可以包括任意数量的 it contextdescribe 代码块。当使用它们来测试不同对象的相同行为时,你可以少写很多不必要的重复代码。

一般来说,你使用共享用例进行测试时不需要依赖其他额外的对象。在 Swift 中,你可以简单地用一个不带参数的 sharedExample 闭包来使用共享用例。当你需要进行全局测试时,这很有用。

// Swift

import Quick

sharedExamples("everything under the sea") {
  // ...
}

itBehavesLike("everything under the sea")

如果你使用 Objective-C 的话,你需要传入一个带 QCKDSLSharedExampleContext 参数的 block即使你并不打算使用它。不好意思你只能这样做人生有时就是这么的无奈。🍪 💣

你也可以使用 fitBehavesLike 函数来单独测试共享用例。