[Unit tests] Mocking D objects

Andre Pany andre at s-e-a-p.de
Wed Aug 22 17:27:41 UTC 2018


On Wednesday, 22 August 2018 at 08:33:36 UTC, Andrey wrote:
> Hello,
> I know that D has build-in unit tests. If so, what mechanism D 
> provides for mocking objects?
> For example:
>>struct WebParser
>>{
>>    // ...
>>
>>    int download(string path)
>>    {
>>        SomeHttpClient client(path);
>>        auto result = client.request(path, 10, "Qwerty");
>>
>>        // ...
>>
>>        return result.getSomething();
>>    }
>>}
>
> Here I want to replace struct/class SomeHttpClient from 
> 3d-party library with my own test implementation. Something 
> like this maybe:
> unittest
> {
>     SomeMagicMockMechanism!(SomeHttpClient, MyMockedClient);
>
>     WebParser parser;
>     auto value = parser.download("www.example.com"); // uses 
> MyMockedClient.request
>     assert(value == 10);
>
> }

You could also create an interface IHttpClient, a class 
HttpClientProductive which forwards the calls to SomeHttpClient 
and a class HttpClientDummy which can be instrumented which data 
it should return in unit test case. Both classes implements the 
interface.
You also need a way to set the productive class for productive 
scenario and the dummy class in test scenario, e.g. via a factory 
class.

There is a huge benefit using this way, you have a very loose 
coupling to SomeHttpClient. You can replace it very easily with 
another library.

You could use this approach also for file system access, 
environment variables access, databases...

Kind regards
Andre


More information about the Digitalmars-d-learn mailing list