> On Jul 27, 2016, at 4:41 PM, David Owens II via swift-evolution 
> <swift-evolution@swift.org> wrote:
> 
> I brought this up in review, but there seems to be a serious testability 
> problem here because of how special @testable is.
> 
> // This class is not subclassable outside of ModuleA.
> public class NonSubclassableParentClass {
>     // This method is not overridable outside of ModuleA.
>     public func foo() {}
> 
>     // This method is not overridable outside of ModuleA because
>     // its class restricts its access level.
>     // It is not invalid to declare it as `open`.
>     open func bar() {}
> 
>     // The behavior of `final` methods remains unchanged.
>     public final func baz() {}
> }
> 
> In a unit test, I *can* subclass `NonSubclassableParentClass`, the access 
> level of `NonSubclassableParentClass` is irrelevant. There’s now no 
> programatic way to ensure that I’m actually testing the contract that I had 
> intended to provide to the consumers of my framework (that my class is 
> subclassable). Is this really the intention?

I could be wrong, but isn't `@testable import` applied per-file? So if you keep 
code users should actually be able to write in one file with a non-`@testable` 
import, and mocks and other testing hacks in a different file with an 
`@testable` import, the first file should fail to compile if you use anything 
that's not normally permitted.

In a future version of Swift, we might consider refining this by requiring 
people to apply `@testable` directly to declarations which treat something 
closed as if it's open, but it seems like even the current feature set does not 
make testing impossible.

-- 
Brent Royal-Gordon
Architechies

_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to