| # The Friend-the-tests Pattern |
| |
| The Friend-the-tests pattern involves friending test fixture classes from the |
| class under test. Chromium has a macro named `FRIEND_TEST_ALL_PREFIXES` that |
| makes this convenient to do. |
| |
| **Note**: Friending test classes is usually not the best way to provide testing |
| access to a class. It makes it far too easy to unintentionally depend on the |
| class's implementation rather than its interface. It is better to use a proper |
| testing interface than to friend test classes. |
| |
| ## Use this pattern when: |
| |
| A test needs simple access to the internals of a class, such as access to |
| individual fields or methods. |
| |
| ## Don't use this pattern when: |
| |
| * Many different test classes need access to a class's internals: you will have |
| to friend too many things and the class under test will end up coupled with |
| too many unit tests. |
| * You're doing it to test private methods: in general, you should not separately |
| test private methods; the correctness of the private methods should be |
| observable from the correctness of the public methods, and if a piece of |
| private behavior has no effect on the public behavior of a class, it might |
| actually be unnecessary. |
| |
| ## Alternatives / See also: |
| |
| * [TestApi] |
| * [ForTesting methods] |
| * ["Test the contract, not the implementation"](https://abseil.io/tips/135) |
| * [Discussion thread on cxx@](https://groups.google.com/a/chromium.org/d/msg/cxx/AOsKCPCBYhk/RDVLSMRGCgAJ) |
| |
| ## How to use this pattern: |
| |
| ```cpp |
| class Foo { |
| public: |
| // ... public API ... |
| |
| private: |
| FRIEND_TEST_ALL_PREFIXES(FooTest, TestSomeProperty); |
| FRIEND_TEST_ALL_PREFIXES(FooTest, TestABehavior); |
| |
| // or if every test in the suite needs private access: |
| friend class FooTest; |
| }; |
| ``` |
| |
| [fortesting methods]: fortesting-methods.md |
| [testapi]: testapi.md |