mercredi 26 août 2015

Mocking methods for unit testing in swift 2

I am finding it difficult to mock methods in structs in swift. I can do it currently using a way that I'll explain below, but it feels wrong to me and would like an opinion on it.

I do not use any third party libraries for mocking, instead I prefer to override the specific method whose result I need to change. Prior to swift, I would always use classes - so it was easy to subclass and override the method that I needed mocked in my unit test case.

Now most of my constructs are structs as they do not really need to be reference types. But then I cannot override any method in my test cases. I do it currently using protocol extensions as outlined below -

protocol AProtocol {
  func a()
  func b() // This calls a()
}

extension AProtocol {
  func a(){
     //Default implementation of a()
  }
  func b(){
     //Default implementation of b() which also calls a()
  }
}

struct A:AProtocol {
  // Empty. struct A will be used by other classes/structs in the code
}

In my test case

struct TestA:AProtocol {
   func a() {
      Some mock implementation of a() so that b() can be tested
   }
}

So my question is this - There is no real need for struct A to be implemented via a protocol. None of the other classes or structs will ever implement AProtocol. But this is the only way I can mock its methods for unit testing. I think the WWDC session on protocol extensions also showed this way of unit testing, but basically I do not need my struct as an implementation of a protocol.

Is there any other way to mock struct methods in swift (without using any third party mocking libs)? Or a better way to test a struct's methods.

Aucun commentaire:

Enregistrer un commentaire