/fake4swift

A small CLI for generating Swift test doubles

Primary LanguageSwiftMIT LicenseMIT

fake4swift is a command line tool that generates type-safe test doubles for Swift.

This is handy if you want to easily generate mocks for protocols in Swift.

Installation (ie: the "easy" way)

  • brew install tjarratt/fake4swift/fake4swift

Build from source (ie: "Installation the hard way")

  • git clone https://github.com/tjarratt/fake4swift.git
  • git submodule update --init --recursive
  • make prefix_install

Features

swift-fakes

Given a swift protocol...

protocol MySomewhatSpecialProtocol {
 func doesStuff(stuff: String, otherStuff: [String]) -> ([String], Int)
}

Run the fake4swift cli...

fake4swift path/to/MySomewhatSpecialProtocol.swift MySomewhatSpecialProtocol

It will generate a test double near it...

path/to/fakes/FakeMySomewhatSpecialProtocol.swift

You can use the generated fake in tests like so...

describe("a generated fake for a contrived protocol") {
   var subject : FakeMySomewhatSpecialProtocol!

   beforeEach() {
       subject = FakeMySomewhatSpecialProtocol.init()
   }

   it("conforms to the MySomewhatSpecialProtocol protocol") {
       var test : MySomewhatSpecialProtocol
       test = subject
       expect(test).toNot(beNil())
   }

   it("allows you to stub the return value for methods that return values") {
      subject.doesStuffReturns((["test-yo"], 5))

      let tuple = subject.doesStuff("this", otherStuff: ["that"])
      expect(tuple.0).to(equal(["test-yo"]))
      expect(tuple.1).to(equal(5))
   }

   it("allows you to write assertions for the arguments passed into each invocation") {
      subject.doesStuffReturns(([], 0))
      subject.doesStuff("kool", otherStuff: ["keith"])

      var args = subject.doesStuffArgsForCall(0)
      expect(args.0).to(equal("kool"))
      expect(args.1).to(equal(["keith"]))

      subject.doesStuff("dr", otherStuff: ["octogon"])

      args = subject.doesStuffArgsForCall(1)
      expect(args.0).to(equal("dr"))
      expect(args.1).to(equal(["octogon"]))
   }
}

Known defects

  • fake4swift : Does not support initializers
  • fake4swift : Does not support protocols that include other protocols
  • fake4swift : Does not handle protocols that use typealias or associatedtype

Feature backlog

The backlog of features for this plugin is currently in Pivotal Tracker.

Contributing

Found a bug? Have a feature request? Interested in submitting a pull request? Please open an issue on Github (or just issue a pull request directly if the fix is pretty clear).

Uninstall

brew uninstall tjarratt/fake4swift/fake4swift

Would not have been possible without the hard work of

  • Brian Croom -- fixed obnoxious fake4swift CLI warnings and added build infrastructure

  • Rachel Brindle -- contributed expertise with Carthage, dynamic linking, homebrew

  • Helen Tang -- created the 'fake mustache' icon (disguise by Helen Tseng from the Noun Project)

  • Ludmil -- created the 'swift' icon (swallow by ludmil from the Noun Project)